2016-03-25 13 views
1

JavaFXアプリケーションから開始するはずのバッチファイルがあります。JavaFX TextBoxにプログラム出力を追加します。

私は異なる実装を試してみました:

は、プロセスが終了し、その後の後、ファイル内のプログラムの出力を追加したファイルを読み、私のテキストボックスにコンテンツを追加します。

これは多くの理由で間違っています。主に、プログラムが終了するまでGUIがハングするためです。

スレッドを使用して調べましたが、スレッドで​​3210を使用すると、同じことが起こります。 私はプロセスを実行している間にそれをやろうとしましたが、出力内容をtextBoxに追加しました。別のスレッドでこれを行っても、プログラムが終了した後にのみ追加されます。

私はまた、Platform.runLater(new Runnable() ...を使用しようとしています。 これにより、コンテンツは定期的に更新されますが、一度に大量のデータが残っており、GUIもハングします。

javafx.concurrent.Task 

ここにそれのための例があります: https://docs.oracle.com/javase/8/javafx/interoperability-tutorial/concurrency.htm

しかし、それでもまだ、私は」を

私はJavaFXのは、スレッドセーフではなく、ライブラリーがあることがわかりました

:基本的に、私はこのような何かが必要ですが、GUIがハングアップしていない可能どの

...私は私が探しています何に近づいていた場合によく分かりません

+0

"Process p"を "InputStream is = p.getInputStream();" –

+0

はい、それは –

+0

でなければなりません。 "while(p.isAlive())"もプロセスが終了してファイルを読み取るのを待つ必要がありますか? –

答えて

-1

解決策は、リンクに表示されているようなタスクを作成し、私のメインポストのコードをその中に入れるだけでした。

James_Dさん、ありがとうございました。

これが最終的な結果である:

Task task = new Task<Void>() 
     { 
      @Override 
      public Void call() 
      { 
       try { 
        Process p = Runtime.getRuntime().exec(executeString);     
        InputStream is = p.getInputStream(); 
        InputStreamReader isr = new InputStreamReader(is); 
        BufferedReader br = new BufferedReader(isr); 

        while(p.isAlive()) 
        { 
         String line; 
         if ((line = br.readLine()) != null) 
          logArea.appendText(line + "\n"); 
        } 
       } catch (IOException e) 
       { 
        e.printStackTrace(); 
       } 
       return null; 
      } 
     }; 
     new Thread(task).start(); 

編集: ...いくつかのより多くのドキュメンテーションを読んだ後

http://docs.oracle.com/javafx/2/threads/jfxpub-threads.htm

http://docs.oracle.com/javafx/2/api/javafx/concurrent/Task.html

Platform.runLater and Task in JavaFX

コードは次のように更新されました:

   while(p.isAlive()) 
       { 
        String line; 
        if ((line = br.readLine()) != null) 
        { 
         Platform.runLater(new Runnable() 
         { 
          @Override 
          public void run() 
          { 
           logArea.appendText(line + "\n"); 
          } 
         }); 
        } 
       } 
+1

Hmm。これが動作するように見えますが、あなたはJavaFXのシングルスレッドルールに違反しています。 FXアプリケーションスレッドで 'logArea.appendText(...)'を呼び出す必要があります: 'Platform.runLater(() - > logArea.appendText(...));'。 –

+0

あなたは正しいです、提案のおかげで! –

関連する問題