如何从后台工作者更新 fxml 标签?

How to update fxml Label from a background worker?

我的 fxml 文件中有一个标签:

<Label fx:id="labelA"/>

我想在后台工作程序执行期间在控制器中更新它。我试过这样做:

public class FXHelloCVController
{
    @FXML
    private Label labelA;
    @FXML
    protected void startMatching(ActionEvent event)
    {   
        SwingWorker<Boolean, String> worker = new SwingWorker<Boolean, String>()
        {
            @Override
            protected Boolean doInBackground() throws Exception
            {

                for(int y=0; y<*something*; y++){
                    if(n.get(y)!=null){
                        ...
                        publish(n.get(y).name);
                        ...
                    }
                }
                return true;
            }

            @Override
            protected void process(List<String> chunks) {
                String n = chunks.get(chunks.size()-1);
                labelA.setText(n);
            }
        };
        worker.execute();
        return;
    }

但是调用函数"labelA.setText(n)"时,出现如下异常:

Exception in thread "AWT-EventQueue-0" java.lang.IllegalStateException: Not on FX application thread; currentThread = AWT-EventQueue-0

怎么了?

SwingWorker 用于 Swing 而不是用于 JavaFX。查看相应 JavaFX 并发机制的文档。

Platform.runLater:如果您需要从非 GUI 线程更新 GUI 组件,您可以使用它来将您的更新放入队列中,它会尽快由 GUI 线程处理.

    Platform.runLater(new Runnable() {
        @Override public void run() {
            // update an FXML node (e.g. label)
        }
    });

来源:Platform.runLater and Task in JavaFX

但是您使用的是 Swing 和 JavaFX,这通常不是。