Java – Jfilechooser with custom filesystemview implementation
I extend filesystemview and override every method in this class The model is as follows:
public class RemoteSystemFilesView extends FileSystemView {
private IDirectoryService directoryService;
public RemoteSystemFilesView(IDirectoryService aDirectoryService){
this.directoryService = aDirectoryService;
}
....
}
The directoryservice object returns a directory from a remote UNIX server Then I created Jfilechooser
JFileChooser fc = new JFileChooser(new RemoteSystemFilesView(new DirectoryService())); int returnVal = fc.showOpenDialog(this);
The dialog box displays the remote directories and files correctly, but then I double-click one of the displayed folders. I want to navigate to the folder, but the folder path appears in the file name field, that's it I cannot remove any directories other than root (/) Should I implement something else in Jfilechooser, not just in filesystemview?
Solution
The problem may be that your filesystemview is actually returning normal Java io. File object
Instead, try to return an extension Java io. File and returns true for public Boolean exists(), while wraps returns virtualfile instead of Java for all required methods io. File.
This is an example of the virtualfilesystem I developed It uses Java nio. Path, because my code is mainly based on them I hope it gives you a good starting point for understanding how to modify your code
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;
}
}
}
