如何在 JFileChooser 保存对话框中处理问号或星号(“?”或“*”)?

Posted

技术标签:

【中文标题】如何在 JFileChooser 保存对话框中处理问号或星号(“?”或“*”)?【英文标题】:How do I handle question marks or asterisks ('?' or '*') in JFileChooser save dialog? 【发布时间】:2021-06-07 22:41:59 【问题描述】:

首先我创建一个JFileChooser,然后调用showSaveDialog。如果用户在File Name 输入字段的任何位置输入问号? 或星号*,那么我会得到一些非常奇怪的行为。即,File Name 字段中用户输入的文本被复制到 Files of Type 字段中。

最小的可重现示例(没有导入):

public class ChooserTest 
    static String path;

    public static void main(String[] args) 
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        JButton saveAsButton = new JButton("Save As");
        saveAsButton.addActionListener(e -> saveAs());
        frame.add(saveAsButton);
        frame.pack();
        frame.setVisible(true);
    

    private static void saveAs() 
        JFileChooser jfc = new JFileChooser(FileSystemView.getFileSystemView().getHomeDirectory());
        int returnState = jfc.showSaveDialog(null);
        if(returnState == JFileChooser.APPROVE_OPTION) 
            path = jfc.getSelectedFile().getAbsolutePath();
            try 
                File f = new File(path);
                FileWriter out = new FileWriter(f);
                out.write("hello world");
                out.close();
             catch (Exception e)
                e.printStackTrace();
            
         else 
            return;
        
    

我已经在两台不同的 Windows 机器上复制了 Java 15 和 16 中的这种行为。在我的代码中,我确实在 path = jfc.getSelectedFile().getAbsolutePath(); 之前验证了用户提供的文本,但是无论我告诉系统做什么,这种行为都会发生,因此它必须在 JFileChooser 返回选项之前发生。

这里是发生了什么的屏幕截图:

如果用户输入了file_name??.txt,那么这就是Files of Type 字段中出现的内容。它再现了用户输入的文本。

最后,我确实找到了 2015 年另一位 SO 用户的两个相关帖子,但这似乎更复杂,我不想破坏他们的问题。

【问题讨论】:

【参考方案1】:

如果 FileChooser 对文件列表进行动态过滤。

如果用户输入“?”然后它将过滤所有文件名与单个字符。

如果用户输入如下内容:“table*”,它将过滤所有以“table”开头的文件。

如果用户输入如下内容:“table?”它将过滤所有以“table”开头的文件以及任何其他字符。

BasicFileChooserUI 类中,当出现“*”或“?”时,FileFilter 会不断用GlobFilter 重置。在文件名中找到字符。

我不知道如何禁用此功能。

【讨论】:

以上是关于如何在 JFileChooser 保存对话框中处理问号或星号(“?”或“*”)?的主要内容,如果未能解决你的问题,请参考以下文章

取消在 JFileChooser 中选择文件而不关闭对话框

如何使用 JFileChooser 保存文件?

如何从 JFileChooser(JAVA Swing) 中禁用文件操作、文件选择和过滤面板?

如何使用 JFileChooser 保存 file.txt?

如何通过 JFileChooser 将 Icon 对象保存到文件中?

Swing:按下 ESC 键时如何关闭对话框?