2014-11-03 65 views
0

我想要做一個無限循環誰改變我的用戶界面。但直到循環結束,我的UI不會改變。 我正在嘗試使用任務,循環中的一個任務和其他更改UI但我不知道如何傳達任務。 在我的具體問題,我正在做一個「ping 127.0.0.1」,它返回給我一個無限的字符串。我可以在System.out的打印,但沒有在文本區域JavaFX任務通信

作品:

BufferedReader reader = SSH.execute(「ping 127.0.0.1」); 
    String linea; 
    String outputText = ""; 
    while ((linea = reader.readLine()) != null) 
    { 
     outputText = outputText + linea +"\n" ; 
     System.out.println(linea); 
    } 
    //taTerminal.setText(outputText); 

不起作用:

BufferedReader reader = SSH.execute(「ping 127.0.0.1」); 
    String linea; 
    String outputText = ""; 
    while ((linea = reader.readLine()) != null) 
    { 
     outputText = outputText + linea +"\n" ; 
     taTerminal.setText(linea); 
    } 
    //taTerminal.setText(outputText); 
+0

這是在後臺線程中執行的嗎? – 2014-11-03 14:13:43

回答

0

我找到一個解決方案,而不是最好。我使用兩個按鈕:

@FXML private TextField tfCmd; 
@FXML private TextArea taTerminal; 
@FXML private Button btStart; 
@FXML private Button btRefresh; 

public Task<String> task; 

public FXML_ExecuteInfiniteController() 
{ 
    this.task = new Task<String>() 
    { 
     @Override protected String call() throws Exception 
     { 
      String cmd = tfCmd.getText(); 
      BufferedReader reader = SSH.execute(cmd); 

      String linea; 
      String outputText = ""; 
      while ((linea = reader.readLine()) != null) 
      { 
       System.out.println(linea); 
       outputText = outputText + linea +"\n" ; 
       updateMessage(outputText); 

      } 
      return outputText; 
     } 
    }; 
} 

@FXML private void actionStart(ActionEvent event1)throws Exception 
{ 
    Thread th = new Thread(task); 
    th.start(); 
} 

@FXML private void actionRefresh(ActionEvent event1)throws Exception 
{ 
    taTerminal.setText(task.getMessage()); 
} 
2

確保您在後臺任務中執行循環。您可以使用TaskmessageProperty來存儲文本,因爲這將在FX應用程序線程上正確更新。然後,您可以綁定觀察消息屬性和更新文本區域時,它的變化:

@FXML private void actionStart(ActionEvent event1)throws Exception 
{ 
    final String cmd = tfCmd.getText(); 
    final Task<Void> task = new Task<Void>() 
    { 
     @Override protected Void call() throws Exception 
     { 
      BufferedReader reader = SSH.execute(cmd); 

      String linea; 
      String outputText = ""; 
      while ((linea = reader.readLine()) != null) 
      { 
       System.out.println(linea); 
       outputText = outputText + linea +"\n" ; 
       updateMessage(outputText); 

      } 
      return null; 
     } 
    }; 

    task.messageProperty().addListener(new ChangeListener<String>() { 
     @Override 
     public void changed(ObservableValue<? extends String> obs, String oldMessage, String newMessage) { 
      taTerminal.setText(task.getMessage()); 
     } 
    }); 

    Thread th = new Thread(task); 
    th.start(); 
} 

這將對於少量文本的工作,但你要替換每次整段文字是非常低效。更好的方法是使用Platform.runLater(...)將文本追加到文本區域中:

@FXML private void actionStart(ActionEvent event1)throws Exception 
{ 
    final String cmd = tfCmd.getText(); 
    final Task<Void> task = new Task<Void>() 
    { 
     @Override protected Void call() throws Exception 
     { 
      BufferedReader reader = SSH.execute(cmd); 

      String linea; 
      while ((linea = reader.readLine()) != null) 
      { 
       System.out.println(linea); 
       final String text = linea + "\n" ; 
       Platform.runLater(new Runnable() { 
        @Override 
        public void run() { 
         taTerminal.appendText(text); 
        } 
       }); 

      } 
      return null; 
     } 
    }; 


    Thread th = new Thread(task); 
    th.start(); 
} 
+0

謝謝,但是如果我嘗試這個,它會告訴我一個錯誤: 「從內部類引用的局部變量必須是最終的或有效的最終...」 並且javaFX不允許我爲widjets放置最終變量 – Charlio 2014-11-03 16:00:27

+0

查看更新。 (如果您仍然有編譯錯誤,請說明哪些行會生成它們。) – 2014-11-03 16:15:31