在沒有(很多)更多信息的情況下完全回答你的問題幾乎是不可能的,但是我使用的一般方法是讓算法有一個回調來處理一條消息,這個消息可以被每一步該算法。在FX應用程序線程上,從控制器傳遞一個實現更新文本區域的回調函數。
喜歡的東西:
public class Algorithm {
private Consumer<String> statusCallback ;
public Algorithm(Consumer<String> statusCallback) {
this.statusCallback = statusCallback ;
}
public Algorithm() {
// by default, callback does nothing:
this(s -> {});
}
public void performAlgorithm() {
while (! finished()) {
doNextStep();
String statusMessage = getStatus();
statusCallback.accept(statusMessage);
}
}
}
然後
public class Controller {
private View view = ... ;
public void startAlgorithm() {
Algorithm algorithm = new Algorithm(s -> Platform.runLater(view.appendStatus(s)));
Thread t = new Thread(algorithm::performAlgorithm);
t.setDaemon(true);
t.start();
}
}
對於View
然後執行以下操作(注意,你可以打倒textArea.setScrollTop(Double.MAX_VALUE);
滾動):
public class View {
private TextArea textArea ;
public View() {
textArea = new TextArea();
// ...
}
public void appendStatus(String status) {
if (!textArea.getText().isEmpty()) {
textArea.appendText("\n");
}
textArea.appendText(status);
textArea.setScrollTop(Double.MAX_VALUE);
}
}
這隻要你的算法不會產生太多的狀態u就應該工作pdates速度太快(這樣它們會溢出FX應用程序線程並阻止它正常工作)。