1

我正在尝试做的是即使在单击按钮后也实时在 textarea 上打印文本。

当我单击该按钮时,UI 会冻结,直到其工作完成,之后,它会与 System.out.println 不同,将所有文本一起打印。

下面的代码是我尝试过的,它没有按我的预期工作。UI 只是挂起,并没有在 textarea 上显示“测试”。

不需要使用监听器,只使用 appendText 也没关系,但我只是不知道如何让按钮的 ActionEvent 工作而不冻结 UI。

我将非常感谢您的任何帮助或更好的代码!

final TextField announcement = new TextField();
    Platform.runLater(new Runnable() {
        @Override public void run() {
            announcement.textProperty().addListener(new javafx.beans.value.ChangeListener<String>() {
                        public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {
                        textoutput.appendText(announcement.getText());
                        }
            });
        }
    });

btn.setOnAction(new EventHandler<ActionEvent>() {
    @Override
        public void handle(ActionEvent event) { 
             announcement.setText("test");
             // bunch of codes below
        }
});
4

2 回答 2

1

您是否尝试过使用Platform.runLater?我的代码中有长时间运行的任务,这些任务使用 Platform.runLater() 调用定期更新 UI。它通过在 JavaFX 应用程序的主线程上运行 Runnable 来实现这一点,因此它与您的长任务分开执行。

例如(使用 Java8 lambdas - 你可以只传入一个新的 Runnable 实现;为了清楚起见,在这种情况下我更喜欢 lambdas):

btn.setOnAction(new EventHandler<ActionEvent>() {
@Override
    public void handle(ActionEvent event) { 
         // Somewhere in your new Task()
         Platform.runLater(() -> {
             // Update UI
             announcement.setText("test");
         });
         // bunch of codes below
    }
});
于 2014-09-16T08:52:51.303 回答
0

原因是您的事件处理程序正在 FX 线程上执行,因此 UI 在完成之前无法更新。正如 ItachiUchiha 已经建议的那样,您应该将代码放在Task中。当您需要更新 TextArea 中的文本时,请使用 Tasks updateMessage()方法。将 ChangeListener 放在 Tasks 消息属性上,并从该侦听器中设置文本。

于 2015-02-07T17:30:24.813 回答