java - 如何在javafx中的子程序调用之前设置 anchor Pane 可见?

标签 java javafx

以下代码的目的是处理菜单选项选择。由于方法 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/

相关文章:

java - 识别 wav 之间模式的算法

java - 在 for 循环中使用数组元素作为终止

java - 链表删除错误

java - 从头开始创建模式对话框

java - 如何创建完全自定义的 JavaFX 控件?或者: how to create Pane with dynamically drawn background?

java - Sonar 规则 - 重新排序接口(interface)默认方法的修饰符

java - Android TCP 客户端。服务器仅在进程停止后接收消息

JavaFx 场景生成器选择条形图轴类型

java - 通过 TableView 中选定行第二列上的 ENTER 键显示上下文菜单 (JavaFX)

javafx-2 - JavaFX 中的 setDefaultCloseOperation()