Java Swing:如何使 setFileFilter() 在 FileChooser 设置的目录之外工作

Java Swing: how to make setFileFilter() work beyond the directory the FileChooser is set to

我有一个函数 openFileAction(),当我在我的 JMenuBar 中单击 'File' > 'Open' 选项时调用该函数。它的第一行看起来像这样:

private static String myPath = ... // some path

private void openFileAction() {
    JFileChooser fileChooser = new JFileChooser();
    fileChooser.setCurrentDirectory(new File(myPath));
    
    if (fileChooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) {
        File f = null;
        try {
            fileChooser.setDialogType(JFileChooser.OPEN_DIALOG);
            fileChooser.setFileFilter(new FileNameExtensionFilter(null, ".txt");
            f = fileChooser.getSelectedFile();
            ...

我只想看到 .txt 个文件作为建议 -- 所以我在 fileChooser 上调用 setFileFilter()

这适用于目录 fileChooser 设置为 myPath -- 即,在出现的 'Open' 弹出窗口 window 中,我只看到.txt 该目录中的文件(和文件夹)。但是,如果我在弹出窗口 window 中离开 myPath,比如说 Desktop,我会看到 所有 文件(和文件夹)那里,不再像我想的那样只有 .txt 个文件。

如何才能在我导航到的任何目录中只看到 .txt 个文件?

首先,在显示之前按照您想要的方式配置对话框,所以,而不是...

JFileChooser fileChooser = new JFileChooser();
fileChooser.setCurrentDirectory(new File(myPath));

if (fileChooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) {
    File f = null;
    try {
        fileChooser.setDialogType(JFileChooser.OPEN_DIALOG);
        fileChooser.setFileFilter(new FileNameExtensionFilter(null, ".txt");
        f = fileChooser.getSelectedFile();

你应该做些更像...

JFileChooser fileChooser = new JFileChooser();
fileChooser.setCurrentDirectory(new File(myPath));
fileChooser.setDialogType(JFileChooser.OPEN_DIALOG);
fileChooser.setFileFilter(new FileNameExtensionFilter(null, ".txt");

if (fileChooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) {
    File f = null;
    try {
        f = fileChooser.getSelectedFile();

其次,正确配置FileFilter。您应该给它某种“描述”,因为它已呈现给用户并且您不需要扩展中的 .,相反,它应该更像是...

fileChooser.setFileFilter(new FileNameExtensionFilter("Text files", "txt");

可运行示例...

import java.awt.EventQueue;
import java.io.File;
import javax.swing.JFileChooser;
import javax.swing.filechooser.FileNameExtensionFilter;

public class Test {
    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                File myPath = new File(".");
                JFileChooser fileChooser = new JFileChooser();
                fileChooser.setCurrentDirectory(myPath);
                fileChooser.setDialogType(JFileChooser.OPEN_DIALOG);
                fileChooser.setFileFilter(new FileNameExtensionFilter("Text files", "txt"));

                if (fileChooser.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) {
                    File selectedFile = fileChooser.getSelectedFile();
                    System.out.println("You have selected " + selectedFile);
                }
            }
        });
    }
}

我也会考虑仔细看看 How to Use File Choosers