2014-11-03 38 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