2016-07-05 12 views
1

Eclipseからメインメソッドを実行するときに問題なく動作するjavaFxアプリケーションがあります。しかし、ファイルを選択するためにFileChooseを使用するボタンをクリックすると、アプリケーションを実行可能な.jarに変換して.jarを実行すると、このエラーが発生します。アプリケーションが.jarに変換されたときにFileChooserが動作しない

「スレッドの例外 『スレッド20』 java.lang.IllegalStateException:Thisoperationのみイベントスレッド上で許可されている。currentThread =スレッド-20」

は、ここで私が持っているコードと、再びこのコードの作品があります私がEclipseからアプリケーションを実行したときに素晴らしい。ちょうど.jarに変換されたときではない。私はアプリケーションをjarファイルに変換するためにeclipseを使いました。

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

それはどういう意味ですか?ある意味では、それ自体のスレッドの中では、uploadCSVThread? –

+0

私はそれをPlatform.runlaterスレッドに入れようとしましたが、後でなく直ちにファイルを知る必要があります。後でファイルを取得するまで待つと、runLaterスレッドが起動するまでコードが実行され、selectedFileはnullになります。 –

答えて

0

ビットが長いので答えに移動しました。私はあなたのブレースを間違えた。それは確かにそれ自身のスレッドです。正確にどこでエラーが発生しているかを見つけるために、キャッチにe.printStackTrace()を追加します。メソッドの呼び出しの1つがスレッドの本体内で有効ではないようです。あなたが場所を見つけてもそれを理解できない場合は、私たちに知らせるためにあなたの投稿を更新してください。それ以外の場合は、Taskオブジェクト を使用して調べることができます。

+0

うわー、それは私がそれを働かせて好きに見えます。私はちょっと騙されたhahaですが、それでも動作します。私は、グローバルなファイル変数を作成し、ボタンがクリックされるたびに、そのグローバルなファイル変数をスレッドの外に設定してからスレッド内で参照します。そうすれば、私は実際にuploadCSVThreadのFileChooserを呼び出しません。本当にありがとうございました。私はこれが重複する質問ではないことを指摘したいと思います。私はPlatform.runLaterを使ってみましたが、私の問題は解決しませんでした。 –

関連する問題