Eclipse에서 main 메소드를 실행할 때 전혀 문제가없는 javaFx 응용 프로그램이 있습니다. 그러나 응용 프로그램을 실행 .jar로 변환하고 파일 선택을 위해 FileChoose를 사용하는 버튼을 클릭하면 .jar 파일을 실행할 때이 오류가 발생합니다.응용 프로그램이 .jar로 변환 될 때 FileChooser가 작동하지 않습니다.
"예외 스레드"스레드-20 "java.lang.IllegalStateException : Thisoperation는 이벤트 thread에 허가되어 currentThread = 스레드 (20)"여기
는 내가 가지고있는 코드를 다시이 코드 작품이다 대단한데 내가 이클립스에서 응용 프로그램을 실행할 때, 그냥 .jar로 변환 할 때. 나는 이클립스를 사용하여 응용 프로그램을 항아리로 변환했다.public void uploadMessagesButtonActionPerformed(ActionEvent event) {
if(uploadCSVThread.isAlive()) {
uploadCSVThread.interrupt();
try {
uploadCSVThread.join();
} catch(InterruptedException e) {
e.printStackTrace();
}
}
uploadCSVThread = new Thread() {
public void run() {
Platform.runLater(new Runnable() {
public void run() {
loader.setProgress(0.0);
loader.setVisible(true);
}
});
FileChooser currUploadFile = new FileChooser();
File selectedFile = currUploadFile.showOpenDialog(null);
if(selectedFile != null) {
System.out.println(selectedFile.getPath());
try {
FileReader currRdr = new FileReader(selectedFile);
CSVReader currReader = new CSVReader(currRdr);
final ArrayList<String[]> listOfMessages = (ArrayList<String[]>) currReader.readAll();
for(int i = 0; i < listOfMessages.size(); i++) {
final int x = i;
String[] shipmentMessages = listOfMessages.get(i);
//String[] shipmentMessages = currReader.readNext();
//while(shipmentMessages != null) {
/*for(int i = 0; i < shipmentMessages.length; i++) {
System.out.println("shipmentMessages -> " + shipmentMessages[i]);
}*/
Map<String, String> headers = createHeaderMapFromHeaderString(shipmentMessages[0], "\n");
String body = shipmentMessages[1];
shipmentMessages = currReader.readNext();
try {
/*ObjectName queue = new ObjectName("org.apache.activemq:type=Broker,brokerName=" + currentBrokerName
+ ",destinationType=Queue,destinationName=" + VM_AND_DIRECTVM_Q);*/
//headers.put("TO_DESTINATION", returnSelectedEndpoints());
QueueViewMBean queueView = (QueueViewMBean) MBeanServerInvocationHandler.newProxyInstance(conn,
currentQueue,
QueueViewMBean.class,
true);
queueView.sendTextMessage(headers, body, serverLookUp.serverUserNameLookUp(currentServer), serverLookUp.serverPasswordLookUp(currentServer));
Platform.runLater(new Runnable() {
public void run() {
loader.setProgress((double)x/(double)listOfMessages.size());
}
});
} catch (MalformedObjectNameException e) {
logger.error(e);
}
}
updateQueueInList(currentQueue, currentQueueIndx, true);
readQueue(conn, currentQueue);
loader.setVisible(false);
} catch (Exception e) {
messageCouldntSendPopUpBox.setVisible(true);
logger.error(e);
}
}
loader.setVisible(false);
}
};
uploadCSVThread.start();
}
'FileChooser'를 자신의'Thread'에 넣으려고 했습니까? –
그게 무슨 뜻이야? 그것 자체 스레드에서 바로 지금, 업로드 CSVThread? –
나는 그것을 Platform.runlater 쓰레드에 넣으려고했지만 나중에는 알지 못한다. 나중에 파일을 얻기 위해 대기하는 경우 runLater 스레드가 시작될 때까지 코드가 실행되고 selectedFile은 null이됩니다. –