Java JFileChooser - 我只能在我设置的目录中选择 .txt

-2 java swing jfilechooser

你好,我在一个java项目中工作,我想创建一个我拥有的JFileChooser,但我只想在一个目录中选择,就像我有一个名为“Saves”的目录,我希望打开JFileChooser的人只能访问其中的txt目录调用“保存”。他们无法访问其他任何内容,只能访问我设置的目录。

我只想访问 txt 并且无法访问其他目录或其他路径

我研究了很多,但找不到任何东西。如果您知道其他类似的选择,请帮助我!谢谢。

Joa*_*uer 5

自定义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)

  • @kleopatra:是的,“FileSystemView”没有特别详细的记录。感觉就像他们刚刚暴露了内部实现细节。当然,在测试过程中您必须记住和/或找出一些极端情况。 (2认同)