文件选择器对话框未关闭

时间:2012-12-12 10:50:06

标签: java javafx-2 javafx

这是我的文件选择器对话框操作代码...

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'按钮时自动关闭。

我在代码中遗漏了什么,当我们点击“打开”或“取消”按钮时,会关闭对话框?
有人可以帮帮我吗?

2 个答案:

答案 0 :(得分:2)

你在UI的Application Thread上进行了长时间的运行,这不应该完成,否则UI将无法响应。

而是创建TaskThread来在应用程序线程上执行长时间运行的进程。

有关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变得无法响应。

首先阅读,

Threads

The Event Dispatch Thread

SwingWorker

使用Event Dispatch Thread,您可以调度UI线程。查看@Erick Robertson提供的与EDT相关的answer

SO中有很多关于上述主题的帖子。