JavaFX 2 StringProperty does not update field unti

2019-02-20 03:19发布

I would like to update a Label in a JavaFX application so that the text changes multiple times as the method runs:

private void analyze(){
    labelString.setValue("Analyzing"); // (labelString is bound to the Label during initialization)
    // <Some time consuming task here>
    labelString.setValue("Analysis complete!");
}

But when I run this, the label does not update until the task finishes, and just displays whatever it was before until the analyze() method returns.

How can I force update the label so that it will show "Analyzing" in the beginning followed by "Analysis complete!" when the task is complete?

标签: java javafx-2
1条回答
Viruses.
2楼-- · 2019-02-20 03:47

Assuming you are invoking your analyze() method on the FX Application Thread (e.g. in an event handler), your time consuming code is blocking that thread and preventing the UI from updating until it is complete. As @glen3b says in the comments, you need to use an external thread to manage this code.

JavaFX provides a Task API which helps you do this. In particular, it provides methods which invoke code on the Java FX Application thread for you, allowing you to update the UI safely from your background Task.

So you can do something like

private void analyze() {
    Task<Void> task = new Task<Void>() {
        public Void call() {
            updateMessage("Analyzing");
            // time consuming task here
            updateMessage("Analysis complete");
        }
    };
    labelString.bind(task.messageProperty());
    new Thread(task).start();
}

If you need to unbind the StringProperty when the task is complete, you can do

task.setOnSucceeded(new EventHandler<WorkerStateEvent>() {
    @Override
    public void handle(WorkerStateEvent event) {
        labelString.unbind();
    }
});
查看更多
登录 后发表回答