代码之家  ›  专栏  ›  技术社区  ›  Jeff Storey

JFileChooser选择目录但显示文件

  •  17
  • Jeff Storey  · 技术社区  · 14 年前

    我觉得应该有一个简单的方法来做这件事,但我想不出来。我有一个jFileChooser,允许用户选择目录。我想显示目录中的所有文件,以给用户一些上下文,但只有目录可以被接受为选择(当选择文件时,可能会禁用“打开”按钮)。有什么简单的方法可以做到吗?

    7 回复  |  直到 7 年前
        1
  •  13
  •   camickr    14 年前

    重写approveSelection()方法。类似:

    JFileChooser chooser = new JFileChooser( new File(".") )
    {
        public void approveSelection()
        {
            if (getSelectedFile().isFile())
            {
                // beep
                return;
            }
            else
                super.approveSelection();
        }
    };
    
        2
  •  17
  •   ablaeul    14 年前

    我的解决方案是将卡米克和垃圾神的答案结合起来:

        final JFileChooser chooser = new JFileChooser() {
                public void approveSelection() {
                    if (getSelectedFile().isFile()) {
                        return;
                    } else
                        super.approveSelection();
                }
        };
        chooser.setFileSelectionMode( JFileChooser.FILES_AND_DIRECTORIES );
    
        3
  •  13
  •   trashgod    7 年前

    setFileSelectionMode() 在里面 How to Use File Choosers :

    setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY)
    

    附录:通过取消第73行的注释可以看到效果。 FileChooserDemo 但它似乎依赖于平台。

    附录:如果使用 FILES_AND_DIRECTORIES ,考虑相应地更改按钮文本:

    chooser.setApproveButtonText("Choose directory");
    

    由于影响取决于L&F,请考虑使用 DIRECTORIES_ONLY 在已经满足用户界面要求的平台上:

    if (System.getProperty("os.name").startsWith("Mac OS X")) {
        chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
    } else {
        chooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
    }
    
        4
  •  2
  •   nhahtdh Pankaj Wadhwa    11 年前

    覆盖的解决方案 approveSelection 对某些用户来说可能很烦人。

    有时,用户会毫无理由地单击目录中的文件(即使她想选择目录而不是文件)。如果发生这种情况,用户将陷入 JFileChooser 作为 批准选举 即使她取消选择该文件,也将失败。为了避免这种烦恼,我这样做:

    JFileChooser fileChooser = new JFileChooser();
    
    fileChooser.setFileSelectionMode(
            JFileChooser.FILES_AND_DIRECTORIES);
    
    int option = fileChooser.showDialog(null,
            "Select Directory");
    
    if (option == JFileChooser.APPROVE_OPTION) {
        File f = fileChooser.getSelectedFile();
        // if the user accidently click a file, then select the parent directory.
        if (!f.isDirectory()) {
            f = f.getParentFile();
        }
        System.out.println("Selected directory for import " + f);
    }
    

    选择目录,即使用户选择了一个文件,在我看来也会有更好的可用性。

        5
  •  1
  •   Uri    14 年前

    afaik jfilechooser将文件过滤(可以查看的,非常可配置的)与选择过滤(可以选择的)分开。

    选择过滤的配置更为有限,但是afaik您可以选择只允许使用dirs或只允许选择文件 setFileSelectionMode()

        6
  •  1
  •   alexandre1985    9 年前

    保持 fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY) 用途:

    File[] selectedFiles = fileChooser.getSelectedFile().listFiles();
    
        7
  •  -1
  •   Martin Tilsted    14 年前

    我认为最好的解决方案就是允许用户选择文件或目录。如果用户选择一个文件,只需使用该文件所在的目录。