【问题标题】:JFileChooser, want to lock it to one directoryJFileChooser,想把它锁定到一个目录
【发布时间】:2012-01-19 12:38:44
【问题描述】:

我有这个程序,您可以在其中下载文件,并且我希望 JFileChooser 被锁定到一个文件夹(目录),以便用户无法浏览其他任何内容。他只能从文件夹“C:\Users\Thomas\Dropbox\Prosjekt RMI\SERVER\”中选择文件。我试过这样搜索,但没有找到任何东西。 我的代码是:

String getProperty = System.getProperty("user.home");
JFileChooser chooser = new JFileChooser(getProperty + "/Dropbox/Prosjekt RMI/SERVER/"); //opens in the directory "//C:/Users/Thomas/Dropbox/Project RMI/SERVER/"
int returnVal = chooser.showOpenDialog(parent);
if (returnVal == JFileChooser.APPROVE_OPTION) {
System.out.println("You chose to open this file: " + chooser.getSelectedFile().getName());

这工作正常,但现在我可以转到我不想这样做的文件夹 Project RMI。

在此先感谢 :)

编辑:在你的帮助下我做了什么:

JFileChooser chooser = new JFileChooser(getProperty + "/Dropbox/Project RMI/SERVER/"); 
                chooser.setFileView(new FileView() {
                    @Override
                    public Boolean isTraversable(File f) {
                        return (f.isDirectory() && f.getName().equals("SERVER")); 
                    }
                });
                int returnVal = chooser.showOpenDialog(parent);
                if (returnVal == JFileChooser.APPROVE_OPTION) {
                    System.out.println("You chose to open this file: "
                            + chooser.getSelectedFile().getName());
                }

【问题讨论】:

    标签: java jfilechooser


    【解决方案1】:

    设置FileView 并覆盖isTraversable 方法,使其仅对您希望用户查看的目录返回true。

    这是一个例子:

    String getProperty = System.getProperty("user.home");
    final File dirToLock = new File(getProperty + "/Dropbox/Prosjekt RMI/SERVER/");
    JFileChooser fc = new JFileChooser(dirToLock);
    fc.setFileView(new FileView() {
        @Override
        public Boolean isTraversable(File f) {
             return dirToLock.equals(f);
        }
    });
    

    【讨论】:

    • 谢谢 (L) 完美工作
    【解决方案2】:

    制作一个自定义 FileSystemView,将其用作接受 FSV 的 JFileChooser constructors 之一的参数。

    【讨论】:

      【解决方案3】:

      在我的情况下,我需要禁用目录导航并选择不同的文件扩展名这是后人的另一种方法:禁用导航控件的小型递归方法:

      private void disableNav(Container c) {
      for (Component x : c.getComponents())
        if (x instanceof JComboBox)
          ((JComboBox)x).setEnabled(false);
        else if (x instanceof JButton) {
          String text = ((JButton)x).getText();
          if (text == null || text.isEmpty())
            ((JButton)x).setEnabled(false);
          }
        else if (x instanceof Container)
          disableNav((Container)x);
        }
      

      然后调用如下:

      JFileChooser fc = new JFileChooser(imgDir);
      disableNav(fc);
      FileNameExtensionFilter filter = new FileNameExtensionFilter("Images", "jpg", "gif", "png");
      fc.setFileFilter(filter);
      ...
      

      【讨论】:

        猜你喜欢
        • 2012-07-12
        • 1970-01-01
        • 1970-01-01
        • 2016-07-15
        • 2019-12-21
        • 1970-01-01
        • 1970-01-01
        • 2011-03-02
        • 1970-01-01
        相关资源
        最近更新 更多