我有一个接口方法,它应该返回一个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;
}
这就是我想要实现的目标:
限制:必须在没有额外库和&gt; = Java7
的情况下完成答案 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;
}
}