你好,我在一个java项目中工作,我想创建一个我拥有的JFileChooser,但我只想在一个目录中选择,就像我有一个名为“Saves”的目录,我希望打开JFileChooser的人只能访问其中的txt目录调用“保存”。他们无法访问其他任何内容,只能访问我设置的目录。
我研究了很多,但找不到任何东西。如果您知道其他类似的选择,请帮助我!谢谢。
自定义FileSystemView可用于调整用户可以看到的内容以及可以导航的位置。例如,这是一个简单的实现,假装传入的目录是根(和主)目录并且没有父目录(请注意,大多数方法只是委托给系统文件系统视图):
public class RestrictedFileSystemView extends FileSystemView {
private final FileSystemView delegate;
private final File baseDirectory;
RestrictedFileSystemView(File baseDirectory) {
this.baseDirectory = baseDirectory;
this.delegate = FileSystemView.getFileSystemView();
}
@Override
public File[] getRoots() {
return new File[] { baseDirectory };
}
@Override
public File getHomeDirectory() {
return baseDirectory;
}
@Override
public File getDefaultDirectory() {
return baseDirectory;
}
@Override
public File getParentDirectory(File dir) {
if (dir.equals(baseDirectory)) {
return null;
}
return delegate.getParentDirectory(dir);
}
@Override
public boolean isRoot(File f) {
return f.equals(baseDirectory);
}
// all methods below here just delegate
@Override
public Boolean isTraversable(File f) {
return delegate.isTraversable(f);
}
@Override
public String getSystemDisplayName(File f) {
return delegate.getSystemDisplayName(f);
}
@Override
public String getSystemTypeDescription(File f) {
return delegate.getSystemTypeDescription(f);
}
@Override
public Icon getSystemIcon(File f) {
return delegate.getSystemIcon(f);
}
@Override
public Icon getSystemIcon(File f, int width, int height) {
return delegate.getSystemIcon(f, width, height);
}
@Override
public boolean isParent(File folder, File file) {
return delegate.isParent(folder, file);
}
@Override
public File getChild(File parent, String fileName) {
return delegate.getChild(parent, fileName);
}
@Override
public boolean isFileSystem(File f) {
return delegate.isFileSystem(f);
}
@Override
public boolean isHiddenFile(File f) {
return delegate.isHiddenFile(f);
}
@Override
public boolean isFileSystemRoot(File dir) {
return delegate.isFileSystemRoot(dir);
}
@Override
public boolean isDrive(File dir) {
return delegate.isDrive(dir);
}
@Override
public boolean isFloppyDrive(File dir) {
return delegate.isFloppyDrive(dir);
}
@Override
public boolean isComputerNode(File dir) {
return delegate.isComputerNode(dir);
}
@Override
public File createFileObject(File dir, String filename) {
return delegate.createFileObject(dir, filename);
}
@Override
public File createFileObject(String path) {
return delegate.createFileObject(path);
}
@Override
public File[] getFiles(File dir, boolean useFileHiding) {
return delegate.getFiles(dir, useFileHiding);
}
@Override
public File[] getChooserComboBoxFiles() {
return delegate.getChooserComboBoxFiles();
}
@Override
public boolean isLink(File file) {
return delegate.isLink(file);
}
@Override
public File getLinkLocation(File file) throws FileNotFoundException {
return delegate.getLinkLocation(file);
}
@Override
public File createNewFolder(File containingDir) throws IOException {
return delegate.createNewFolder(containingDir);
}
}
Run Code Online (Sandbox Code Playgroud)
(仅在 Linux 上快速测试,其他操作系统可能需要对某些覆盖进行额外更改)。
请注意,您可以通过覆盖进一步限制用户可以访问的目录isTraversable(),甚至可以通过覆盖来限制他们看到的内容getFiles()。
您可以像这样使用这个自定义文件系统视图JFileChooser:
FileSystemView fsv = new RestrictedFileSystemView(someBaseDirectory);
JFileChooser jfc = new JFileChooser(fsv);
jfc.showOpenDialog(parentComponent);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
70 次 |
| 最近记录: |