首页 > 解决方案 > JavaFX 和多线程 - GIF 无法启动

问题描述

我尝试实现一个 GUI 按钮,以便在按下它时执行两个操作 - 执行主代码(2-3 秒)和显示 gif-preloader。

为此,我使用了 Task,在 setOnAction 方法中初始化并运行它。反过来,任务本身使用 showGif () 方法来启动图像。

另外,它们工作正常 - showGif () 打开 GIF,Task 显示与控制台中的主代码并行工作的计数器。

但是当我把showGif()放到Task里面的时候,方法就不行了。它到达“pane.setCenter (hb);”行 并停止。我认为他没有足够的时间来启动 GIF,并在主代码中添加了 5 秒的延迟 - 这也没有帮助。

我做错了什么?

除了 Task,我还尝试了 Platform.runLater(new Runnable) - 结果是一样的。

按钮动作:

btn_find.setOnAction(new EventHandler<ActionEvent>() {
        public void handle(ActionEvent event) {

            isStarted = true;

            task = new Task<Object>() {
                @Override protected Object call() throws Exception {
                    showGif();
                    return null;
                }
            };

            new Thread(task).start();

            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }...

GIF 方法:

protected static void showGif() {
    System.out.println("opening GIF...");

    File file = new File("/Users/user/Desktop/cat-preloader.gif");

    String localUrl = null;
    try {
        localUrl = file.toURI().toURL().toString();

    } catch (Exception e) {
        e.printStackTrace();
    }


    Image image = new Image(localUrl, 200,200, false, true);
    ImageView imageView = new ImageView(image);

    hb = new HBox();

    hb.setStyle("-fx-background-color: lightgrey");
    hb.setOpacity(0.7);
    hb.getChildren().add(imageView);
    HBox.setMargin(imageView, new Insets(300, 100, 60, 200));
    BorderPane.setMargin(hb, new Insets(0, 0,600, 0));

    System.out.println("setting the pane");

    // here thread execution stops
    pane.setCenter(hb); 
    System.out.println("GIF started");
}

标签: javamultithreadingjavafx

解决方案


推荐阅读