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; } } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |