我必须在gui执行一项长期任务。 我想阻止用户输入并在执行时使窗口变灰。 为此,我在表单中添加了一个完整的场景窗格:
<Pane
visible="false"
opacity="0.50"
style="-fx-background-color: gray;"
fx:id="paneBlocker" />
我打算使用的代码:
private void doLongTask() {
showBlocker(true); // Shows the blocker pane and blocks the input
Platform.runLater( () -> {
longTask();
otherTaskModifyingGui();
showBlocker(false); // Hide blocker
});
}
我认为这是异步的,因此showBlocker
中所做的更改会生效,但事实并非如此。
我还尝试将长任务移到另一个线程:
private void doLongTask() {
showBlocker(true);
new Thread(() -> {
longTask();
Platform.runLater(() -> {
otherTaskModifyingGui();
showBlocker(false);
});
}).run();
}
它也不起作用。 : - (
如何强制GUI显示阻止程序?
答案 0 :(得分:1)
使用JavaFX Task API:http://docs.oracle.com/javafx/2/threads/jfxpub-threads.htm
Task为其生命周期提供了各种钩子,比如
无需Platform.runLater()
次来电。