【问题标题】:Swing: FileDialog stuck in long processSwing:FileDialog卡在漫长的过程中
【发布时间】:2013-10-18 14:17:41
【问题描述】:

我们使用 FileDialog 打开/保存菜单。当我们保存文件时,首先我们使用 FileDialog 填充模态窗口。用户输入文件名后,保存操作需要很长时间(最多 45 秒),因为其中涉及耗时的导出过程。所以问题是,在导出过程中,FileDialog 窗口关闭,但 FileDialog 的位置有一个灰色区域。直到保存过程完成,灰色区域将被清除。代码是:

 File file = null;
 File fd = new FileDialog(mainFrame, "Save", FileDialog.SAVE);

 fd.setDirectory("./");
 fd.setLocation(50, 50);
 fd.setVisible(true);

 if (fd.getFile() != null) {
   file = new File(fd.getDirectory() + fd.getFile());
 }

 // This is a time consuming process
 ExportFromDB edb = new ExportFromDB(); 
 // Program continues

有没有办法彻底清除 FileDialog 窗口?谢谢

【问题讨论】:

  • 你的“导出”进程应该在另一个线程中。
  • 1) 不要阻塞 EDT(事件调度线程)——当这种情况发生时,GUI 会“冻结”。而不是调用 Thread.sleep(n) 实现 Swing Timer 用于重复任务或 SwingWorker 用于长时间运行的任务。有关详细信息,请参阅Concurrency in Swing。 2)FileDialog 是 AWT,而不是 Swing。 Swing 等效项是JFileChooser
  • 非常感谢您的有用评论!

标签: java swing awt filedialog


【解决方案1】:

您看到的灰色框是因为EDT 被阻止并且无法更新 GUI。

您应该考虑使用SwingWorker 在后台线程上执行长时间运行的任务。

Java 7 下可用的另一个选项是SecondaryLoop

查看Hidden Java 7 Features – SecondaryLoop 了解详细说明和示例。

【讨论】:

    【解决方案2】:

    在导出完成之前,您的 UI 将“卡住”,最好的办法是在单独的线程中完成工作。

    【讨论】:

      最近更新 更多