java - 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");
}
解决方案
推荐阅读
- node.js - nodejs - 在 Windows 文件服务器上保持会话
- python-2.7 - 想在 tkinter gui 窗口中创建两个标签并显示连续计数值:
- html - flex-direction 在 chrome 中没有按预期工作
- magento - 避免 ajax 在重定向之前显示会话消息(magento 2)
- php - 使用heroku迁移时找不到工匠
- angular - 如何在别人中使用组件?
- android-fragments - 从另一个活动中调用活动内的片段方法
- javascript - IE 11 - 带有事件侦听器的本地存储在从一个选项卡注销时刷新其他浏览器选项卡中的页面,在 IE 中不起作用
- html - 仅在 y 索引中溢出图像
- google-cloud-platform - 从 Google Cloud Storage 请求公共图像时减少 TTFB