几乎不可能在没有(很多)更多信息的情况下完全回答您的问题,但我将使用的一般方法是让算法有一个回调来处理消息,该消息可以由算法的每个步骤调用。从控制器,传递一个回调的实现,它在 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);
}
}
只要您的算法不会太快地创建太多状态更新(这样它们会淹没 FX 应用程序线程并阻止其正常工作),这应该可以工作。