繁体   English   中英

如何将Java ChangeListener添加到方法返回

[英]How to add a Java ChangeListener to a method return

我有一个带有“中止”按钮的任务控制GUI,该按钮调用了一些取消代码(工作正常)。 但是,我想将按钮的禁用状态同步到任务是否正在运行,因此如果任务未运行,则禁用该选项。 我可以通过其Boolean Future.isDone()方法检查任务的状态,但是我想让JavaFX通过bound属性自动管理状态。 但是,我无法弄清楚如何建立绑定,也无法在方法上设置ChangeListener。 谁能建议如何最好地完成?

编辑 :我认为这个问题最终归结为“如何包装Future.isDone()以使其可观察?”

指导非常感谢。

使用Task 您可以观察state属性来修改Button的disabled属性:

private ExecutorService service;

@Override
public void stop() throws Exception {
    service.shutdownNow();
}

@Override
public void init() throws Exception {
    service = Executors.newSingleThreadScheduledExecutor();
    // service = new ThreadPoolExecutor(1, 2, 1, TimeUnit.SECONDS, new ArrayBlockingQueue<>(10));
}

@Override
public void start(Stage primaryStage) {
    Button startButton = new Button("Start");

    Task<Void> task = new Task<Void>() {

        @Override
        protected Void call() throws Exception {
            Thread.sleep(5000);
            System.out.println("task finished");
            return null;
        }

    };

    Button cancelButton = new Button("cancel");
    cancelButton.setOnAction(evt -> task.cancel());
    cancelButton.setDisable(true); // button disabled before submitting task

    startButton.setOnAction((ActionEvent event) -> {
        startButton.setDisable(true);

        // cancel Button enabled until task is succeeded/failed/was cancelled
        cancelButton.disableProperty().bind(Bindings.createBooleanBinding(() -> {
            switch (task.getState()) {
                case CANCELLED:
                case FAILED:
                case SUCCEEDED:
                    return true;
                default:
                    return false;
            }
        }, task.stateProperty()));

        // simulate some work to be done by the service
        service.submit(() -> {
            try {
                Thread.sleep(5000);
            } catch (InterruptedException ex) {
            }
            System.out.println("runnable finished");
        });
        service.submit(task);
    });

    // show state as text
    Text text = new Text();
    text.textProperty().bind(task.stateProperty().asString());

    VBox root = new VBox(10, startButton, cancelButton, text);

    Scene scene = new Scene(root, 300, 300);

    primaryStage.setScene(scene);
    primaryStage.show();
}

解决了,还是足够好。 绑定到SimpleBooleanProperty的GUI控件。 构造函数启动一个后台线程Runnable, isDone()线程以半秒的睡眠在无限循环中轮询isDone()并更新绑定的SBP。 再次感谢fabian,为我指出了一个适当的解决方案,以供将来参考。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM