如何处理 JFileChooser 保存对话框中的问号或星号('?' 或 '*')?
How do I handle question marks or asterisks ('?' or '*') in JFileChooser save dialog?
首先我创建一个 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 returns 选项之前发生.
这是发生的情况的屏幕截图:
如果用户输入 file_name??.txt
,那么 Files of Type
字段中就会显示该内容。它再现了用户输入的文本。
最后,我确实找到了另一个 SO 用户在 2015 年发表的两篇相关帖子,但这似乎更复杂,我不想打扰他们的问题。
如果 FileChooser 在文件列表上进行动态过滤。
如果用户输入“?”然后它将过滤所有具有单个字符的文件名。
如果用户输入类似:“table*”,它将过滤所有以“table”开头的文件。
如果用户输入类似:“table?”它将过滤所有以“table”加上任何其他字符开头的文件。
在 BasicFileChooserUI
class 中,当“*”或“?”中的任何一个出现时,FileFilter 会随着 GlobFilter
不断重置。在文件名中找到字符。
我不知道如何禁用此功能。
首先我创建一个 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 returns 选项之前发生.
这是发生的情况的屏幕截图:
file_name??.txt
,那么 Files of Type
字段中就会显示该内容。它再现了用户输入的文本。
最后,我确实找到了另一个 SO 用户在 2015 年发表的两篇相关帖子,但这似乎更复杂,我不想打扰他们的问题。
如果 FileChooser 在文件列表上进行动态过滤。
如果用户输入“?”然后它将过滤所有具有单个字符的文件名。
如果用户输入类似:“table*”,它将过滤所有以“table”开头的文件。
如果用户输入类似:“table?”它将过滤所有以“table”加上任何其他字符开头的文件。
在 BasicFileChooserUI
class 中,当“*”或“?”中的任何一个出现时,FileFilter 会随着 GlobFilter
不断重置。在文件名中找到字符。
我不知道如何禁用此功能。