如何使用FutureTask <v>,等待ui事件?

时间:2016-03-22 21:10:32

标签: java javafx futuretask

我有一个接口方法,它应该返回一个Future对象。

Future<Result> doSomething()

此方法的实现显示了一些ui(javafx)。 其中一个ui元素有一个监听器,需要调用才能接收实际结果,我需要。

我如何实现这一目标? 有更好的解决方案吗?

这是我需要等待的示例动作:

// this is some framework method I cannot change
@Override
public Data execute(Data data) {
    Future<Data> dataFuture = handler.doSomething(data);
    // this should basically wait until the user clicked a button
    return dataFuture.get();
}

// handler implementation
public Future<Data> doSomething(Data data) {
    // the question is how to implement this part, to be able to
    // return a future object
    Button button = new Button("Wait until click");
    // create thread that waits for the button click ?!????
    // modify incoming data object when the button was clicked
    // somehow create the Future object that's bound to the button click
    return future;
}

这就是我想要实现的目标:

  1. 我的方法doSomething显示一个新的场景(ui),上面有一个按钮
  2. 并立即返回未来对象
  3. future.get()等待用户按下按钮
  4. 限制:必须在没有额外库和&gt; = Java7

    的情况下完成

2 个答案:

答案 0 :(得分:0)

使用javafx.concurrent.Task。它来自FutureTask。关于任务使用的链接javadoc中有大量示例。

Oracle还提供了一个讨论任务用法的教程:

我认为这是你想要的,但我可能已经理解了这个问题,如果有的话,请稍微编辑一下这个问题以澄清要求(也许是mcve)。让我有点不确定的是你的标题中的部分“等待ui事件?”,我不太确定在这种情况下这意味着什么。

答案 1 :(得分:-1)

这是我正在寻找的解决方案。它不是很好,因为Thread.sleep并不能说服我。

但现在你可以理解我想要实现的目标

// make sure this is not called on the ui thread
public Future<Data> doSomething(Data data) {
    WaitingFuture future = new WaitingFuture(data);
    Platform.runLater(() -> {
                Button button = new Button("Wait until click");
                button.setOnAction(future);
                // show button on ui...
            });
    favouriteExecutorService.submit(future);
    return future;
}

static class WaitingFuture extends Task<Data> implements EventHandler<ActionEvent> {
    private Data data;

    WaitingFuture(Data originalData) {
        this.data = originalData;
    }

    private Data waitingData;

    @Override
    public void handle(ActionEvent event) {
        waitingData = data.modify();
    }

    @Override
    protected Data call() throws Exception {
        while (waitingData == null) {
            Thread.sleep(100);
        }
        return waitingData;
    }
}