【问题标题】:How can I make JFileChooser behave properly with disconnected network drives?如何使 JFileChooser 在断开网络驱动器的情况下正常运行?
【发布时间】:2012-09-06 04:44:11
【问题描述】:

当我在网络驱动器断开连接的系统上创建 JFileChooser 时,需要很长时间才能显示 JFileChooser。它通过一个断开的网络驱动器阻塞 EDT 大约 20 秒。

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

  • 使用 JFileDialog
  • 将 FileSystemView 替换为 getRoots() 返回固定驱动器列表的选项
  • 在尝试打开 JFileChooser(s) 之前切换到 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.

【问题讨论】:

  • 您可能希望以this source 为起点推出自己的产品。
  • “也许 13 年前提交这个错误报告的那个人在这里闲逛,现在已经弄清楚了。” 如果他们没有提到它作为解决方法错误报告(此类信息的最佳位置),为什么他们现在要提及它? ..还是那是讽刺?
  • aaaach 现在我看到一些头脑发热的用户删除了我在您的FileBro 上关于WinXP 上针对Network DrivesMy Network 的挂起问题的帖子,

标签: java swing jfilechooser event-dispatch-thread


【解决方案1】:

您阻止了 EDT,如果 Network Drive 不可访问或返回异常,您可能会遇到 RepaintManager 异常,您必须这样做

  • 使用SwingWorkerRunnable#Thread

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

  • 如果成功,则显示JFileChooserFiles

  • 否则您的 GUI 将冻结,直到网络驱动器返回内容或异常

【讨论】:

  • 当我打电话给new JFileChooser() 时发生延迟。必须根据this 的回答在 EDT 上拨打该电话。我已经用示例代码和日志输出更新了我的问题。
  • 不是当文件夹被打开一次时,通道中的文件内容会被缓存,直到勾选过期(取决于本地操作系统和网络侧的硬件),
  • 以前被认为在概念上是正确的。当稍后在 EDT 上调用 JFileChooser 时,工作人员将不得不做任何必要的事情来最小化延迟。例如,我有一个带有硬编码降速计时器的 USB 主轴,我只是在其上以稍短的间隔 touch 一个隐藏文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-09-14
  • 1970-01-01
  • 1970-01-01
  • 2020-07-13
  • 1970-01-01
  • 2012-11-24
  • 1970-01-01
相关资源
最近更新 更多