如何使断开的网络驱动器使JFileChooser正常运行?

时间:2012-09-06 04:44:12

标签: java swing jfilechooser event-dispatch-thread

当我在具有断开网络驱动器的系统上创建JFileChooser时,在显示JFileChooser之前需要永远。它通过一个断开的网络驱动器阻止EDT大约20秒。

这似乎是一个常见问题,但我无法找到解决问题的方法。我见过的可能选择是:

  • 使用JFileDialog
  • 将fileSystemView替换为getRoots()返回固定驱动器列表
  • 的文件
  • 在尝试打开JFileChooser之前切换到WAIT游标
  • 在启动时创建一个JFileChooser并永远保留它
  • 尝试使用xfiledialog

我的用例非常简单,我讨厌诉诸第三方图书馆。其他选择对我来说都很糟糕。

还有其他建议吗?

也许13年前提交this错误报告的人在这里闲逛,现在已经弄明白了。

更新了代码和记录输出

这是我正在使用的代码。

private void initFileChooser() {
    log.debug("Initializing fileChooser.");

    fileChooser = new JFileChooser();
    log.debug("FileChooser instantiation complete.");

    fileChooser.setFileFilter(new FileNameExtensionFilter("PDF Files", "pdf"));
    log.debug("File filter setup complete.");

    fileChooser.setMultiSelectionEnabled(false);
    log.debug("Multi-selection disabled.");

    fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
    log.debug("File selection mode set to files only.");
}

以上代码在没有断开网络驱动器的情况下运行时的日志输出。

05:37:13.126 [AWT-EventQueue-0] DEBUG - Initializing fileChooser.
05:37:13.481 [AWT-EventQueue-0] DEBUG - FileChooser instantiation complete.
05:37:13.482 [AWT-EventQueue-0] DEBUG - File filter setup complete.
05:37:13.482 [AWT-EventQueue-0] DEBUG - Multi-selection disabled.
05:37:13.482 [AWT-EventQueue-0] DEBUG - File selection mode set to files only.

以上是在Windows 7上使用断开的网络驱动器运行上述代码时的日志记录输出。我通过使用ExpanDrive(1.8.4)连接到Linux计算机并关闭来创建断开连接的网络驱动器在初始连接完成后,Linux机器。

05:37:58.953 [AWT-EventQueue-0] DEBUG - Initializing fileChooser.
05:38:11.108 [AWT-EventQueue-0] DEBUG - FileChooser instantiation complete.
05:38:11.110 [AWT-EventQueue-0] DEBUG - File filter setup complete.
05:38:11.110 [AWT-EventQueue-0] DEBUG - Multi-selection disabled.
05:38:11.110 [AWT-EventQueue-0] DEBUG - File selection mode set to files only.

1 个答案:

答案 0 :(得分:0)

您阻止了EDT,如果RepaintManager无法访问或返回异常,可能会出现Network Drive例外,您必须

  • 使用SwingWorkerRunnable#Thread

  • 通知用户"Please wait, whatever ...."

  • 如果成功,则使用JFileChooser

  • 显示Files
  • 否则GUI会冻结,直到网络驱动器返回内容或异常