首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JFileChooser remote视图

JFileChooser remote视图
EN

Stack Overflow用户
提问于 2012-10-16 19:59:18
回答 2查看 1.6K关注 0票数 1

我已经实现了一个JFileChooser作为远程文件系统的视图。当从FileSystemView调用getFiles()时,我向远程系统发送带有目录位置数据的请求。

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

我试过了

代码语言:javascript
复制
fileChooser.updateUI();

但它抛出了以下异常:

代码语言:javascript
复制
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,它会使系统重新加载该目录的预先存在的数据。

当前的代码基本上是:

代码语言:javascript
复制
    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语言基本上只是为了测试,所以我可以查看系统是否被刷新。

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

代码语言:javascript
复制
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;

}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-10-16 20:07:48

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

代码语言:javascript
复制
fileChooser.rescanCurrentDirectory();

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

每次我问一个问题,我很快就会找到答案:/

票数 2
EN

Stack Overflow用户

发布于 2012-10-16 20:08:22

  • 不要调用fileChooser.updateUI();这是为了应用自定义UI或更改Look
  • 中的方法我认为更好的方法是使用JListJTree作为FileSystemView,然后创建新的as
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12914209

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档