2016-07-05 2 views
1

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(); 
} 
+0

'FileChooser'를 자신의'Thread'에 넣으려고 했습니까? –

+0

그게 무슨 뜻이야? 그것 자체 스레드에서 바로 지금, 업로드 CSVThread? –

+0

나는 그것을 Platform.runlater 쓰레드에 넣으려고했지만 나중에는 알지 못한다. 나중에 파일을 얻기 위해 대기하는 경우 runLater 스레드가 시작될 때까지 코드가 실행되고 selectedFile은 null이됩니다. –

답변

0

조금 길게 대답으로 이동했습니다. 나는 너희 중괄호를 잘못 읽었다. 그것은 분명히 자체 스레드에 있습니다. 캐치에 e.printStackTrace()을 추가하여 오류가 발생한 위치를 정확히 찾으십시오. 메서드 호출 중 하나가 스레드 본문 내에서 유효하지 않은 것 같습니다. 위치를 찾았지만 여전히 파악할 수없는 경우 게시물을 업데이트하여 알려주십시오. 그렇지 않으면 Task 개체 을 사용하여 조사 할 수 있습니다.

+0

글쎄, 내가 좋아하는 것 같아. 나는 일종의 속임수 였지만 여전히 효과가있다. 전역 파일 변수를 만들었고 버튼을 클릭 할 때마다 해당 전역 파일 변수를 스레드 외부에서 설정 한 다음 스레드 내부에서 참조합니다. 그렇게하면 실제로 uploadCSVThread에서 FileChooser를 호출하지 않습니다. 도움과 도움을 주신 모든 분들께 감사드립니다. 나는 이것이 중복 질문이 아니지만 지적하고 싶습니다. Platform.runLater를 사용해 보았는데 문제가 해결되지 않았습니다. –

관련 문제