Java 如何使JFileChooser在断开连接的网络驱动器上正常工作?

Java 如何使JFileChooser在断开连接的网络驱动器上正常工作?,java,swing,jfilechooser,event-dispatch-thread,Java,Swing,Jfilechooser,Event Dispatch Thread,在具有断开连接的网络驱动器的系统上创建JFileChooser时,JFileChooser需要很长时间才能显示出来。它用一个断开连接的网络驱动器将EDT阻塞约20秒 这似乎是一个常见的问题,但我找不到解决办法。我看到的可能选项有: 使用JFileDialog 将FileSystemView替换为getRoots()返回固定驱动器列表的文件系统视图 在尝试打开JFileChooser之前切换到等待光标 在启动时创建一个JFileChooser,并将其永久保留 试用 我的用例非常简单,我不喜欢求

在具有断开连接的网络驱动器的系统上创建JFileChooser时,JFileChooser需要很长时间才能显示出来。它用一个断开连接的网络驱动器将EDT阻塞约20秒

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

  • 使用JFileDialog
  • 将FileSystemView替换为getRoots()返回固定驱动器列表的文件系统视图
  • 在尝试打开JFileChooser之前切换到等待光标
  • 在启动时创建一个JFileChooser,并将其永久保留
  • 试用
我的用例非常简单,我不喜欢求助于第三方库。其他的选择对我来说都很糟糕

还有其他建议吗

也许13年前提交错误报告的那个家伙就在这里闲逛,现在已经弄明白了

使用代码和日志输出更新 这是我用的代码

private void initFileChooser(){
调试(“初始化文件选择器”);
fileChooser=newjfilechooser();
debug(“FileChooser实例化完成”);
setFileFilter(新文件名扩展过滤器(“PDF文件”,“PDF”));
调试(“文件过滤器设置完成”);
fileChooser.setMultiSelectionEnabled(false);
调试(“禁用多选”);
fileChooser.setFileSelectionMode(仅限JFileChooser.FILES_);
debug(“文件选择模式设置为仅文件。”);
}
下面是在没有断开连接的网络驱动器的情况下运行上述代码时的日志输出

05:37:13.126[AWT-EventQueue-0]调试-初始化文件选择器。
05:37:13.481[AWT-EventQueue-0]调试-文件选择器实例化完成。
05:37:13.482[AWT-EventQueue-0]调试-文件筛选器安装完成。
05:37:13.482[AWT-EventQueue-0]调试-禁用多选。
05:37:13.482[AWT-EventQueue-0]调试-文件选择模式设置为仅文件。
以下是在Windows7上,当上述代码在断开连接的网络驱动器上运行时的日志输出。我正在创建一个断开连接的网络驱动器,方法是使用(1.8.4)连接到Linux机器,并在初始连接完成后关闭Linux机器

05:37:58.953[AWT-EventQueue-0]调试-初始化文件选择器。
05:38:11.108[AWT-EventQueue-0]调试-文件选择器实例化完成。
05:38:11.110[AWT-EventQueue-0]调试-文件筛选器安装完成。
05:38:11.110[AWT-EventQueue-0]调试-禁用多选。
05:38:11.110[AWT-EventQueue-0]调试-文件选择模式设置为仅文件。

您阻止了EDT,可能是由于
重新绘制管理器
异常在
网络驱动器
无法访问或返回异常的情况下,您必须

  • 使用
    SwingWorker
    Runnable#Thread

  • 通知用户
    “请稍候,…”

  • 如果成功,则使用
    文件显示
    JFileChooser

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


你可能会把自己的使用作为一个出发点。“也许13年前提交此错误报告的人就在这里闲逛,现在已经明白了。”如果他们没有在错误报告中提到这是一个解决方法(这类信息的最佳位置),为什么他们现在会提到它。。或者这是讽刺?aaach现在我看到一些头脑发热的用户删除了我在你的
FileBro
上关于
WinXP
上挂起问题的帖子,对于
网络驱动器和
我的网络
,当我调用
new JFileChooser()
时会发生延迟。该电话必须在EDT Accing上拨打才能接听。我已经用示例代码和日志输出更新了我的问题。不是在文件夹打开一次时,然后缓存通道中的文件内容,直到勾选过期(取决于网络端的本机操作系统和硬件),之前投票认为概念正确。当以后在EDT上调用
JFileChooser
时,工作者将不得不做任何必要的事情来最小化延迟。例如,我有一个USB主轴,带有一个硬编码的降速定时器,我只需在其上以稍短的间隔触摸一个隐藏的文件。