2016-03-25 18 views
1

我有一個批處理文件,應該從我的JavaFX應用程序啓動。將程序輸出附加到JavaFX文本框

我嘗試了多種不同的實現方法:

追加程序的輸出文件,該過程完成此之後,讀取文件,並添加內容到我的文本框中。

這是錯誤的原因很多,主要是因爲GUI掛起,直到程序結束。

所以我研究了使用線程,但是當在線程中使用​​3210時,會發生同樣的事情。 我試圖這樣做,當進程正在運行時,將輸出的內容添加到我的文本框。它只在程序結束後才被添加,即使我在單獨的線程中執行此操作。我也嘗試使用Platform.runLater(new Runnable() ...。 因此,內容會定期更新,但一次仍會大量存儲數據,並且還會導致GUI掛起。

然後我發現,JavaFX是不是線程安全的,並且有一個庫:

javafx.concurrent.Task 

這裏沒有爲它的一個示例: https://docs.oracle.com/javase/8/javafx/interoperability-tutorial/concurrency.htm

但儘管如此,我不能肯定如果我越來越接近我所期待的......

基本上,我需要這樣的事情,但是這使得GUI不掛:

 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; 
      try 
      { 
       if ((line = br.readLine()) != null) 
        logArea.appendText(line + "\n"); 
      } catch(Exception e) 
      { 

      } 
     } 
+0

通過看你的代碼,你不應該定義「過程P」之前先「的InputStream爲= p.getInputStream();」 –

+0

是的,它應該是 –

+0

Shouldnt「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

嗯。雖然這看起來可行,但您違反了JavaFX的單線程規則。您需要在FX應用程序線程上調用'logArea.appendText(...)':'Platform.runLater(() - > logArea.appendText(...));'。 –

+0

你是對的,謝謝你的建議! –