以下代码的目的是处理菜单选项选择。由于方法 update()
中的处理需要相当多的时间,因此我想在此之前显示信息。
我的信息只是一个带有标签的锚定 Pane ,通常设置为不可见。不幸的是,下面的代码将锚定 Pane 设置为仅在 update()
终止后很短的时间内可见。我怎样才能正确地做到这一点?
public void updateRates(ActionEvent event)
{
updateInfo.setVisible(true);
update();
updateInfo.setVisible(false);
}
最佳答案
大多数用户界面库都是单线程的。该线程由 UI 系统创建并控制。所有监听器都在该线程上调用。当 UI 线程被阻塞时,例如当您的 update()
调用正在运行时,UI 根本不会重绘,键盘事件和鼠标事件将在事件队列中“堆积”,似乎被忽略,直到允许线程继续运行(此时所有线程将立即按顺序处理)。
因此,绝不能在 UI 线程上执行冗长的操作。一种选择是运行 Task在不同的线程中:
Task<Boolean> updater = new Task<Boolean>() {
@Override
public Boolean call() {
updateValue(true);
update();
return false;
}
};
updateInfo.visibleProperty().bind(updater.valueProperty());
new Thread(updater).start();
您还可以从普通的 Runnable 创建线程:
updateInfo.setVisible(true);
Runnable updater = new Runnable() {
@Override
public void run() {
update();
Platform.runLater(() -> updateInfo.setVisible(false));
}
};
new Thread(updater).start();
Platform.runLater在这种情况下是必需的,因为用户界面对象(包括所有 JavaFX 节点)只能在 UI 线程中访问和修改。如果您的 update()
方法正在操作任何节点,则需要使用 Platform.runLater 来执行此操作。
Task 类内置支持在 UI 中显示工作进度,但由于您尚未包含 update()
方法的代码,因此我无法告诉您是否支持支持对于您的情况很有用。
关于java - 如何在javafx中的子程序调用之前设置 anchor Pane 可见?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39209488/