簡體   English   中英

JFileChooser 選擇目錄但顯示文件

[英]JFileChooser select directory but show files

我覺得應該有一個簡單的方法來做到這一點,但我無法弄清楚。 我有一個 JFileChooser 允許用戶選擇目錄。 我想顯示目錄中的所有文件以為用戶提供一些上下文,但只應接受目錄作為選擇(也許選擇文件時打開按鈕將被禁用)。 有沒有簡單的方法來做到這一點?

我的解決方案是將 camickr 和trashgod 的答案合並:

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

請參閱如何使用文件選擇器中的setFileSelectionMode()

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

覆蓋批准選擇()方法。 就像是:

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

對於某些用戶來說,覆蓋approveSelection的解決方案可能很煩人。

有時,用戶會無緣無故地單擊目錄中的文件(即使她想選擇目錄而不是文件)。 如果發生這種情況,用戶將(有點)卡在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);
}

在我看來,即使用戶選擇了一個文件,選擇目錄也會導致更好的可用性。

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

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

AFAIK JFileChooser 將文件過濾(可以查看的內容,非常可配置)與選擇過濾(可以選擇的內容)分開。

選擇過濾的配置受到更多限制,但是AFAIK您可以選擇只允許目錄或只允許使用setFileSelectionMode()選擇文件

JFileChooser 支持三種選擇模式:僅文件、僅目錄和文件和目錄。 在您的情況下,您需要的是:

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

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

選擇多個文件夾但顯示所有包含的文件

    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/空文件夾/

  • 文件夾 1/子文件夾 1/1.1.txt

  • 文件夾 1/子文件夾 1/1.2.txt

  • 文件夾 1/子文件夾 1/1.3.txt

  • 文件夾 1/子文件夾 1/子文件夾 1.1/1.1.1.txt

  • 文件夾 1/子文件夾 1/子文件夾 1.1/1.2.1.txt

  • 文件夾 1/子文件夾 1/子文件夾 1.1/1.3.1.txt

  • 文件夾 1/子文件夾 2/2.1/2.1.1.txt

  • 文件夾 1/子文件夾 2/2.1/2.1.2.txt

  • 文件夾 1/子文件夾 2/2.1/2.1.3.txt

  • 文件夾 1/子文件夾 3/3.1.txt

  • 文件夾 1/子文件夾 3/3.2.txt

  • 文件夾 1/子文件夾 3/3.3.txt

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

  • Folder2/子文件夾/EmptyFolder/

  • 文件1.txt

  • 文件2.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

我認為最好的解決方案是允許用戶選擇文件或目錄。 如果用戶選擇一個文件,只需使用該文件所在的目錄。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM