JFileChooser选择目录但显示文件

时间:2010-05-21 15:34:21

标签: java swing jfilechooser

我觉得应该有一个简单的方法来做到这一点,但我无法弄清楚。我有一个允许用户选择目录的JFileChooser。我想显示目录中的所有文件以向用户提供一些上下文,但只有目录应被接受作为选择(可能在选择文件时禁用“打开”按钮)。这样做有简单的方法吗?

9 个答案:

答案 0 :(得分:17)

我的解决方案是camickr和trashgod的答案之间的合并:

    final JFileChooser chooser = new JFileChooser() {
            public void approveSelection() {
                if (getSelectedFile().isFile()) {
                    return;
                } else
                    super.approveSelection();
            }
    };
    chooser.setFileSelectionMode( JFileChooser.FILES_AND_DIRECTORIES );

答案 1 :(得分:13)

覆盖approveSelection()方法。类似的东西:

JFileChooser chooser = new JFileChooser( new File(".") )
{
    public void approveSelection()
    {
        if (getSelectedFile().isFile())
        {
            // beep
            return;
        }
        else
            super.approveSelection();
    }
};

答案 2 :(得分:13)

请参阅setFileSelectionMode()中的How to Use File Choosers

setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY)

附录:通过取消注释FileChooserDemo的第73行可以看到效果,但它似乎与平台有关。

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

chooser.setApproveButtonText("Choose directory");

由于效果依赖于L& F,请考虑在已满足您的UI要求的平台上使用DIRECTORIES_ONLY

if (System.getProperty("os.name").startsWith("Mac OS X")) {
    chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
} else {
    chooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
}

答案 3 :(得分:2)

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

有时,用户只是无缘无故地点击目录中的文件(即使她想要选择目录而不是文件)。如果发生这种情况,即使取消选择该文件,用户也会({kind} a)卡在JFileChooser中,因为approveSelection将失败。为了避免这种烦恼,我就是这样做的:

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);
}

选择目录,即使用户选择了一个文件,我认为可以提供更好的可用性。

答案 4 :(得分:1)

AFAIK JFileChooser将文件过滤(可以查看,可配置的内容)与选择过滤(可以选择)分开。

选择过滤的配置更受限制,但AFAIK可以选择仅允许使用setFileSelectionMode()

选择dirs或仅选择文件

答案 5 :(得分:1)

保留fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY)并使用:

File[] selectedFiles = fileChooser.getSelectedFile().listFiles();

答案 6 :(得分:0)

JFileChooser支持三种选择模式:仅文件,仅目录以及文件和目录。在您的情况下,您需要的是:

JFileChooser fileChooser = new JFileChooser();
fileChooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);

源:http://www.java2s.com/Tutorial/Java/0240__Swing/TheJFileChoosersupportsthreeselectionmodesfilesonlydirectoriesonlyandfilesanddirectories.htm

答案 7 :(得分:0)

Select Multiple Folders But Show All Included files

    import javax.swing.*;
    import java.io.File;
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.Iterator;
    
    public class MultipleFilesAndDirectoryChooserButDisplayFiles {
        public static void main(String[] args) {
            ArrayList<File> tempFiles = new ArrayList<>();
            ArrayList<File> finalFiles = new ArrayList<>();
            ArrayList<String> relativeFiles = new ArrayList<>();
            JFileChooser fileChooser = new JFileChooser();
            fileChooser.setDialogTitle("Choose File To Transfer");
            fileChooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
            fileChooser.setMultiSelectionEnabled(true);
            int returnVal = fileChooser.showOpenDialog(null);
            fileChooser.approveSelection();
            if (returnVal == JFileChooser.APPROVE_OPTION) {
                fileChooser.approveSelection();
                var fileAddress = fileChooser.getSelectedFiles();
                for (var arrElement : fileAddress) {
                    tempFiles.add(arrElement);
                    File baseFile;
                    baseFile = arrElement.getParentFile();
                    Iterator<File> iterator = tempFiles.iterator();
                    while (iterator.hasNext()) {
                        File file = iterator.next();
                        if (file.isDirectory()) {
                            var enclosedFiles = file.listFiles();
                            if (enclosedFiles != null) {
                                if (enclosedFiles.length != 0) {
                                    var index = tempFiles.indexOf(file);
                                    tempFiles.remove(file);
                                    tempFiles.addAll(index, Arrays.asList(enclosedFiles));
                                    iterator = tempFiles.iterator();
                                } else {
                                    tempFiles.remove(file);
                                    finalFiles.add(file);
                                    relativeFiles.add(baseFile.toURI().relativize(file.toURI()).getPath());
                                    iterator = tempFiles.iterator();
                                }
                            }
                        } else if (file.isFile()) {
                            tempFiles.remove(file);
                            finalFiles.add(file);
                            relativeFiles.add(baseFile.toURI().relativize(file.toURI()).getPath());
                            iterator = tempFiles.iterator();
                        }
                    }
    
    
                }
                for (var relativeFile : relativeFiles) {
                    System.out.println(relativeFile);
    
                }
                for (var file : finalFiles) {
                    System.out.println(file);
                }
    
            }
        }
    }

输出:

  • 文件夹1 /空文件夹/

  • Folder1 / SubFolder1 / 1.1.txt

  • Folder1 / SubFolder1 / 1.2.txt

  • Folder1 / SubFolder1 / 1.3.txt

  • Folder1 / SubFolder1 / SubFolder 1.1 / 1.1.1.txt

  • Folder1 / SubFolder1 / SubFolder 1.1 / 1.2.1.txt

  • Folder1 / SubFolder1 / SubFolder 1.1 / 1.3.1.txt

  • Folder1 / SubFolder2 / 2.1 / 2.1.1.txt

  • Folder1 / SubFolder2 / 2.1 / 2.1.2.txt

  • Folder1 / SubFolder2 / 2.1 / 2.1.3.txt

  • Folder1 / SubFolder3 / 3.1.txt

  • Folder1 / SubFolder3 / 3.2.txt

  • Folder1 / SubFolder3 / 3.3.txt

  • 文件夹2 /子文件夹/2.1.txt

  • 文件夹2 /子文件夹/空文件夹/

  • file1.txt

  • file2.txt

  • E:\ Folder1 \ EmptyFolder

  • E:\ Folder1 \ SubFolder1 \ 1.1.txt

  • E:\ Folder1 \ SubFolder1 \ 1.2.txt

  • E:\ Folder1 \ SubFolder1 \ 1.3.txt

  • E:\ Folder1 \ SubFolder1 \ SubFolder 1.1 \ 1.1.1.txt

  • E:\ Folder1 \ SubFolder1 \ SubFolder 1.1 \ 1.2.1.txt

  • E:\ Folder1 \ SubFolder1 \ SubFolder 1.1 \ 1.3.1.txt

  • E:\ Folder1 \ SubFolder2 \ 2.1 \ 2.1.1.txt

  • E:\ Folder1 \ SubFolder2 \ 2.1 \ 2.1.2.txt

  • E:\ Folder1 \ SubFolder2 \ 2.1 \ 2.1.3.txt

  • E:\ Folder1 \ SubFolder3 \ 3.1.txt

  • E:\ Folder1 \ SubFolder3 \ 3.2.txt

  • E:\ Folder1 \ SubFolder3 \ 3.3.txt

  • E:\ Folder2 \ Sub Folder \ 2.1.txt

  • E:\ Folder2 \ Sub Folder \ EmptyFolder

  • E:\ file1.txt

  • E:\ file2.txt

答案 8 :(得分:-1)

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