加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 带有自定义FileSystemView实现的JFileChooser

发布时间:2020-12-15 02:12:28 所属栏目:Java 来源:网络整理
导读:我扩展了FileSystemView并覆盖了这个类中的每个方法.该模型如下所示: public class RemoteSystemFilesView extends FileSystemView { private IDirectoryService directoryService; public RemoteSystemFilesView(IDirectoryService aDirectoryService){ th
我扩展了FileSystemView并覆盖了这个类中的每个方法.该模型如下所示:

public class RemoteSystemFilesView extends FileSystemView {

   private IDirectoryService directoryService;

   public RemoteSystemFilesView(IDirectoryService aDirectoryService){ 
      this.directoryService = aDirectoryService; 
   }
   ....
}

directoryService对象从远程UNIX服务器返回目录.然后,我创建了JFileChooser.

JFileChooser fc = new JFileChooser(new RemoteSystemFilesView(new DirectoryService()));
int returnVal = fc.showOpenDialog(this);

该对话框正确显示远程目录和文件,但随后我双击其中一个显示的文件夹,我希望导航到该文件夹??,但文件夹路径出现在“文件名”字段中,就是这样.我不能去除root(/)以外的任何其他目录.我应该在JFileChooser中实现其他东西,而不仅仅是在FileSystemView中吗?

解决方法

问题可能是您的FileSystemView实际上正在返回普通的java.io.File对象.

而是尝试返回一个扩展java.io.File的VirtualFile包装器对象,并为public boolean exists()返回true,而wraps为所有必需的方法返回VirtualFile而不是java.io.File.

这是我开发的VirtualFileSystem的一个例子.它使用java.nio.Path,因为我的代码主要基于它们.我希望它为您提供了一个理解如何修改代码的良好起点.

private static class VirtualFileSystemView extends FileSystemView {

    final Path base;

    final Set<Path> choices;

    private VirtualFileSystemView(final Path base,final Set<Path> choices) {
        this.base = base;
        this.choices = choices;
    }

    @Override
    protected File createFileSystemRoot(File f) {
        return new VirtualFile(f);
    }

    @Override
    public boolean isComputerNode(File dir) {
        return false;
    }

    @Override
    public boolean isFloppyDrive(File dir) {
        return false;
    }

    @Override
    public boolean isDrive(File dir) {
        return false;
    }

    @Override
    public Icon getSystemIcon(File f) {
        return null;
    }

    @Override
    public String getSystemTypeDescription(File f) {
        return f.toPath().toString();
    }

    @Override
    public String getSystemDisplayName(File f) {
        return f.getName();
    }

    @Override
    public File getParentDirectory(final File dir) {
        return new VirtualFile(dir.getParentFile());
    }

    @Override
    public File[] getFiles(final File dir,boolean useFileHiding) {
        final List<File> files = new ArrayList<>(choices.size());

        choices.stream()
                    .filter((path) -> (path.getParent().equals(dir.toPath()))).
                    forEach((path) -> {
                        files.add(new VirtualFile(path.toFile()));
                    });

        return files.toArray(new File[files.size()]);
    }

    @Override
    public File createFileObject(final String path) {
        return new VirtualFile(path);
    }

    @Override
    public File createFileObject(final File dir,final String filename) {
        Path fileObject;

        if (dir != null) {
            fileObject = Paths.get(dir.toPath().toString(),filename);
        } else {
            fileObject = Paths.get(filename);
        }
        return new VirtualFile(fileObject.toFile());
    }

    @Override
    public File getDefaultDirectory() {
        return new VirtualFile(base.toFile());
    }

    @Override
    public File getHomeDirectory() {
        return new VirtualFile(base.toFile());
    }

    @Override
    public File[] getRoots() {
        final List<File> files = new ArrayList<>(choices.size());

        files.add(new VirtualFile(base.toFile()));
        return files.toArray(new File[files.size()]);
    }

    @Override
    public boolean isFileSystemRoot(final File dir) {
        boolean isRoot = dir.toPath().getParent() == null;
        return isRoot;
    }

    @Override
    public boolean isHiddenFile(final File f) {
        return false;
    }

    @Override
    public boolean isFileSystem(final File f) {
        return !isFileSystemRoot(f);
    }

    @Override
    public File getChild(final File parent,final String fileName) {
        return new VirtualFile(parent,fileName);
    }

    @Override
    public boolean isParent(final File folder,final File file) {
        return file.toPath().getParent().equals(folder.toPath());
    }

    @Override
    public Boolean isTraversable(final File f) {
        boolean isTraversable = false;

        for (final Path path : choices) {
            if (path.startsWith(f.toPath())) {
                isTraversable = true;
                break;
            }
        }
        return isTraversable;
    }

    @Override
    public boolean isRoot(final File f) {
        boolean isRoot = false;

        for (final Path path : choices) {
            if (path.getParent().equals(f.toPath())) {
                isRoot = true;
            }
        }
        return isRoot;
    }

    @Override
    public File createNewFolder(final File containingDir) throws IOException {
        return new VirtualFile(containingDir);
    }


    private class VirtualFile extends File {

        private static final long serialVersionUID = -1752685357864733168L;

        private VirtualFile(final File file) {
            super(file.toString());
        }

        private VirtualFile(String pathname) {
            super(pathname);
        }

        private VirtualFile(String parent,String child) {
            super(parent,child);
        }

        private VirtualFile(File parent,child);
        }

        @Override
        public boolean exists() {
            return true;
        }

        @Override
        public boolean isDirectory() {
            return VirtualFileSystemView.this.isTraversable(this);
        }

        @Override
        public File getCanonicalFile() throws IOException {
            return new VirtualFile(super.getCanonicalFile());
        }

        @Override
        public File getAbsoluteFile() {
            return new VirtualFile(super.getAbsoluteFile());
        }

        @Override
        public File getParentFile() {
            File parent = super.getParentFile();

            if (parent != null) {
                parent = new VirtualFile(super.getParentFile());
            }
            return parent;
        }

    }

}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读