这是我的文件选择器对话框操作代码...
FileChooser fc = new FileChooser();
fc.setTitle("Pointel File");
File file1 = fc.showOpenDialog(MainFrame.objComponent.getPrimaryStage());
int i =0;
while(i < 90000){
System.out.println(i);
i++;
}
在上面的代码中,对话框正在等待'while'循环完成执行,而不是在我们点击'open'按钮时自动关闭。
我在代码中遗漏了什么,当我们点击“打开”或“取消”按钮时,会关闭对话框?
有人可以帮帮我吗?
答案 0 :(得分:2)
你在UI的Application Thread上进行了长时间的运行,这不应该完成,否则UI将无法响应。
而是创建Task
或Thread
来在应用程序线程上执行长时间运行的进程。
有关JavaFX中的并发性的更多信息,请参阅this链接
以下是Task
的简短示例:
import javafx.concurrent.Task;
....
FileChooser fc = new FileChooser();
fc.setTitle("Pointel File");
File file1 = fc.showOpenDialog(MainFrame.objComponent.getPrimaryStage());
final Task task = new Task<Void>() {
@Override
protected Void call() throws Exception {
int i = 0;
while (i < 90000) {
System.out.println(i);
i++;
}
return null;
}
};
Thread th = new Thread(task);
th.setDaemon(true);
th.start();
还要记住,如果您修改任何JavaFX UI组件,请在Platform.runLater(Runnable r)
块中包装代码,如下所示:
import javafx.concurrent.Task;
....
final Task task = new Task<Void>() {
@Override
protected Void call() throws Exception {
int i = 0;
while (i < 90000) {
System.out.println(i);
i++;
}
Platform.runLater(new Runnable() {//updates ui on application thread
@Override
public void run() {
//put any updates to ui here dont run the long running code in this block or the same will happen as doing a long running task on app thread
}
});
return null;
}
};
Thread th = new Thread(task);
th.setDaemon(true);
th.start();
答案 1 :(得分:0)
永远不要在同一个线程上执行GUI和计算任务。您的UI应该在一个线程上运行,您的计算任务应该在其他线程上。如果UI在同一个线程上运行,则UI变得无法响应。
首先阅读,
使用Event Dispatch Thread
,您可以调度UI线程。查看@Erick Robertson提供的与EDT
相关的answer。
SO中有很多关于上述主题的帖子。