Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaFX任务状态未正确更新?_Java_Javafx_Task_Javafx 8_Controlsfx - Fatal编程技术网

JavaFX任务状态未正确更新?

JavaFX任务状态未正确更新?,java,javafx,task,javafx-8,controlsfx,Java,Javafx,Task,Javafx 8,Controlsfx,各位程序员好 因此,我终于开始使用JavaFX,并发现了一些似乎不正确的东西。 如果覆盖任务的调用方法,然后运行该方法,则此任务的状态将在调用完成后开始更新 我的代码看起来像这样 Task<Boolean> myTask = new Task<Boolean>() { @Override protected Boolean call() throws Exception { try { // do stuff

各位程序员好

因此,我终于开始使用JavaFX,并发现了一些似乎不正确的东西。 如果覆盖任务的调用方法,然后运行该方法,则此任务的状态将在调用完成后开始更新

我的代码看起来像这样

Task<Boolean> myTask = new Task<Boolean>() {
    @Override
    protected Boolean call() throws Exception {
        try {
             // do stuff
             return true;
        } catch (Exception e){
             return false;
        }
    }
}
现在,我所期望的顺序是将状态设置为首先调度,然后在执行调用方法之前运行。在我的情况下,它总是先调用,然后一段时间后,它会改变状态

例如:

package test;

import java.util.concurrent.ExecutionException;
import java.util.concurrent.Executors;

import javafx.application.Application;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.concurrent.Task;
import javafx.concurrent.Worker;
import javafx.stage.Stage;

public class TaskTest extends Application {

    @Override
    public void start(Stage primaryStage) {
        Task<Void> myTask = new Task<Void>() {
            @Override
            protected Void call() throws Exception {
                System.out.println("Executing stuff");
                return null;
            }
        };

        myTask.stateProperty().addListener(new ChangeListener<Worker.State>() {

            @Override
            public void changed(
                    ObservableValue<? extends javafx.concurrent.Worker.State> observable,
                    Worker.State oldValue,
                    Worker.State newValue) {
                System.out.println("State change: " + oldValue + " -> " + newValue);

            }
        });

        Executors.newSingleThreadExecutor().execute(myTask);

        try {
            myTask.get();
        } catch (InterruptedException | ExecutionException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

    public static void main(String[] args) {
        launch(args);
    }
}
预期:

State change: READY -> SCHEDULED
State change: SCHEDULED -> RUNNING
Executing stuff
State change: RUNNING -> SUCCEEDED

runLater只是将其放在JavaFX应用程序线程上。调用不需要在runLater中调用,事实上,您特别不希望它这样做,因为这会阻止应用程序线程按预期工作,您可能需要发布更多代码。@MattJennings hello,我添加了更多的代码和我期望的解释,显示了运行任务的代码。@James\u D我用Thread t=new ThreadmyTask;然后是t.run、myTask.run和Executors.newSingleThreadExecutor.executemyTask;。所有三个变量都会导致上述事件顺序。您希望t.start;,不是t.run;。虽然遗嘱执行人。。。代码应该有效。
Executing stuff
State change: READY -> SCHEDULED
State change: SCHEDULED -> RUNNING
State change: RUNNING -> SUCCEEDED
State change: READY -> SCHEDULED
State change: SCHEDULED -> RUNNING
Executing stuff
State change: RUNNING -> SUCCEEDED