javafx - 在 JAVAFX 中处理时显示 gif 动画弹出窗口

标签 javafx

我的一个 Controller 中有一个方法,需要几秒钟的时间来处理。我希望在发生这种情况时弹出 gif 动画,但我只得到静态图像。这是我的代码:

@FXML
public void search(ActionEvent e) {


    final Stage dialog = new Stage();
    Group popup = new Group();
    Image image = new Image("file:resources/images/bender.gif");
    ImageView view = new ImageView(image);
    popup.getChildren().add(view);
    Scene dialogScene = new Scene(popup);
    dialog.setScene(dialogScene);
    dialog.show();

    Platform.runLater(new Runnable() {

        @Override
        public void run() {

            Match msg = stablishSearchConditions();
            TreeItem<String> root = new TreeItem<>("ROOT");
            int indexName = 1;
            String mensaje = "Mensaje ";
            treeLabelResults.setText("");
            arbol.setRoot(root);

            for (Match message : msg.each()) {

                TreeItem<String> nodo = new TreeItem<String>(mensaje + indexName);
                root.getChildren().add(nodo);
                root.setExpanded(true);
                String mens = message.getMessage();
                TreeItem<String> nodo2 = new TreeItem<String>(mens);
                nodo.getChildren().add(nodo2);

                indexName++;
            }
            dialog.close();
        }
    });

}

最佳答案

您正在通过在该线程上运行昂贵的操作来阻塞FX应用程序线程。这会阻止您的 UI 更新,包括 GIF 动画。

将昂贵的操作移至非应用程序线程,并仅使用 Platform.runLater() 来“提交”UI 更新:

Runnable expensiveTask = () -> {
    // expensive operations that should not run on the application thread
    Match msg = stablishSearchConditions();
    TreeItem<String> root = new TreeItem<>("ROOT");
    int indexName = 1;
    String mensaje = "Mensaje ";

    for (Match message : msg.each()) {
        TreeItem<String> nodo = new TreeItem<String>(mensaje + indexName);
        root.getChildren().add(nodo);
        root.setExpanded(true);
        String mens = message.getMessage();
        TreeItem<String> nodo2 = new TreeItem<String>(mens);
        nodo.getChildren().add(nodo2);

        indexName++;
    }

    // update ui -> application thread
    Platform.runLater(() -> {
        treeLabelResults.setText("");
        arbol.setRoot(root);
        dialog.close();
    });
};

// start new thread for expensiveTask
new Thread(expensiveTask).start();

关于javafx - 在 JAVAFX 中处理时显示 gif 动画弹出窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35839686/

相关文章:

java - 如何不对文件路径进行硬编码

java - 将全局按键监听器附加到多个按钮

按下按钮时 javafx 循环

JavaFX TableView .setCellValueFactory 为不带对象的字符串

java - 如何使用 OpenCSV 将 csv 导入 FX SimpleObjectProperties?

java - Linux Mint Java 和 JavaFX

button - Javafx : Activate a tooltip with a button

java - 在 JavaFX 中显示 pdf

java - 无法访问类 com.sun.javafx.util.Utils(在模块 javafx.graphics 中)-JavaFX 和 Eclipse

google-analytics - 基于 JavaFX 小程序的网站的广告