【问题标题】:JFileChooser remote viewJFileChooser 远程视图
【发布时间】:2012-10-16 11:59:18
【问题描述】:

我一直在实现JFileChooser 作为远程文件系统的视图。当从FileSystemView 调用getFiles() 时,我会使用目录位置数据向远程系统发送请求。

然后我异步接收到包含我正在浏览的目录中所有文件的数据包,之后我将文件设置为准备更新视图(这样下次调用getFiles()它将返回接收到的文件数组)但是问题是我不知道如何更新JFileChoosers 视图。

我试过了

fileChooser.updateUI();

但它会引发以下异常:

Exception in thread "pool-1-thread-31" java.lang.NullPointerException
    at com.sun.java.swing.plaf.windows.WindowsFileChooserUI.setDirectorySelected(Unknown Source)
    at javax.swing.plaf.basic.BasicFileChooserUI$Handler.valueChanged(Unknown Source)
    at javax.swing.JList.fireSelectionValueChanged(Unknown Source)
    at javax.swing.JList$ListSelectionHandler.valueChanged(Unknown Source)
    at javax.swing.DefaultListSelectionModel.fireValueChanged(Unknown Source)
    at javax.swing.DefaultListSelectionModel.fireValueChanged(Unknown Source)
    at javax.swing.DefaultListSelectionModel.fireValueChanged(Unknown Source)
    at javax.swing.DefaultListSelectionModel.moveLeadSelectionIndex(Unknown Source)
    at sun.swing.FilePane.clearSelection(Unknown Source)
    at sun.swing.FilePane.doFilterChanged(Unknown Source)
    at sun.swing.FilePane.propertyChange(Unknown Source)
    at java.beans.PropertyChangeSupport.fire(Unknown Source)
    at java.beans.PropertyChangeSupport.firePropertyChange(Unknown Source)
    at java.beans.PropertyChangeSupport.firePropertyChange(Unknown Source)
    at java.awt.Component.firePropertyChange(Unknown Source)
    at javax.swing.JFileChooser.setFileFilter(Unknown Source)
    at javax.swing.JFileChooser.addChoosableFileFilter(Unknown Source)
    at javax.swing.JFileChooser.updateUI(Unknown Source)
    at com.ruuhkis.remoteserver.ui.RemoteView.updateFiles(RemoteView.java:252)
    at com.ruuhkis.remoteserver.ui.RemoteApplication.onFileListReceived(RemoteApplication.java:122)
    at com.ruuhkis.remoteserver.packets.impl.FileListPacket.handlePacket(FileListPacket.java:32)
    at com.ruuhkis.remoteserver.packets.PacketHandler$1.run(PacketHandler.java:57)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

当我在目录中并且我知道它已收到新文件列表并按 f5 时,它将显示刚刚加载的新文件,我怎样才能使它不必按 f5?同样,按 f5 会导致系统重新加载目录的预先存在的数据。

目前的代码基本上是:

    view = new FileSystemView() {

        int c;

        @Override
        public File[] getFiles(File dir, boolean useFileHiding) {

            if(!auto) {
                PacketBuilder builder = new PacketBuilder(OpCodes.FILE_LIST_REQUEST_PACKET.getOpCode());
                root = dir.getAbsolutePath();
                builder.writeString(dir.getAbsolutePath());
                builder.write(RemoteView.this.remote.getChannel());
            }
            auto = false;



            if(dirContent == null)
                return new File[]{new File((c++) + ".txt")};
            else
                return dirContent;
        }

        @Override
        public Boolean isTraversable(File arg0) {
            return true;
        }

        @Override
        public File createNewFolder(File arg0) throws IOException {
            // TODO Auto-generated method stub
            return null;
        }
    };

c 基本上只是为了测试,所以我可以查看系统是否刷新

当我收到文件列表时,我会这样做:

public void updateFiles(String list) {
    String[] parts = list.split("" + ((char)10));
    File[] files = new File[parts.length];

    for(int i = 0 ; i < parts.length; i++) {
        files[i] = new File(root + File.separatorChar + parts[i]);

    }



    dirContent = files;

    fileChooser.setCurrentDirectory(new File(root));

    fileChooser.updateUI();

    auto = true;

}

【问题讨论】:

  • pool-1-thread-31 听起来不像是事件调度线程。 Swing 不是线程安全的,因此您不应该从另一个线程访问文件选择器,然后是 EDT
  • 另见FileBrowser
  • @trashgod 太美了,我去看看代码确定!

标签: java swing file-io filesystems jfilechooser


【解决方案1】:

【讨论】:

  • 如何在 JFileChooser 中使用 JList 或 JTree?
  • 不要用(JFileChooser包含JTable)代替,还有one of great project by @Andrew Thompson
  • 好点,尽管我喜欢 JFileChooser 的 UI,但我可能必须尝试一下。
  • 可能是最简单的方法,您可以通过延迟时间和处理器影响重定向到 SwingWorker 或 Runnable#Thread 的 FileSystem 的任何重新加载,基本上 JList 是正确的方法,但 JTree 适用于大多数结构化输出...
【解决方案2】:

浏览其他 JFileChooser 项目后我找到了方法

fileChooser.rescanCurrentDirectory();

这似乎更新了文件系统视图..

每次我问一个问题,我都会在不久之后找到答案:/

【讨论】:

  • “每次我问一个问题,我都会在不久之后找到答案:/” 似乎是寻找几个月的东西,然后当你购买替代品的那一刻,丢失的物品似乎是用魔法出现的。从好的方面看,至少在这种情况下您不必购买任何东西。 ;)
  • 你说得好! :) 希望这至少可以帮助遇到同样问题的其他人。
  • 我猜想你有时间再考虑一下,你会想出更多的理由。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多