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

时间:2016-05-22 10:40:10

标签: java javafx backgroundworker fxml

我的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

有什么问题?

2 个答案:

答案 0 :(得分:2)

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,这通常不是。

答案 1 :(得分:1)

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