我有一个扩展JFileChooser类的FileSaver类。构造函数定义了一些文件过滤器,设置了默认文件过滤器并调用setAcceptAllFileFilterUsed(false)
。当用户单击按钮时,将创建FileSaver对象并为其调用showSaveDialog()
。 FileSaver类会覆盖approveSelection()
,以便在调用super.approveSelection()
之前验证输入的文件名。
对于输入的大多数文件名都可以,但如果文件名包含问号(“?”)或星号(“*”),则不会调用approveSelection()
并创建新的文件过滤器(并显示当程序主要将文件过滤器视为其先前的设置时设置,文件名为描述。是否可以将这些文件名视为任何其他文件名(例如调用approveSelection()
并相应地选择所选文件)?
此外,似乎包含正斜杠(“/”)的文件名被视为相对于当前目录的路径,因此getSelectedFile().getName()
仅在斜杠(或删除)后返回文件名的一部分文件名末尾的斜杠)和附加到目录路径之前的部分。 approveSelection()
是否可以检索验证的完整文件名而不是更改目录?
答案 0 :(得分:0)
尝试在JFileChooser类上添加此类,此类实现 WindowsFileChooserUI 的 getApproveSelectionAction 方法:
public class MyFileChooser extends JFileChooser{
@Override
protected void setUI(ComponentUI newUI) {
super.setUI(new CustomFileChooserUI(this));
}
private static boolean isGlobPattern(String filename) {
return ((File.separatorChar == '\\' && (filename.indexOf('*') >= 0
|| filename.indexOf('?') >= 0))
|| (File.separatorChar == '/' && (filename.indexOf('*') >= 0
|| filename.indexOf('?') >= 0
|| filename.indexOf('[') >= 0)));
}
public class CustomFileChooserUI extends WindowsFileChooserUI {
JFileChooser jfileChooser;
public CustomFileChooserUI(JFileChooser b) {
super(b);
jfileChooser = b;
}
@Override
protected void createModel() {
super.createModel();
}
@Override
public Action getApproveSelectionAction() {
return new ApproveSelectionAction() {
@Override
public void actionPerformed(ActionEvent e) {
String filename = getFileName();
if(isGlobPattern(filename)){
// your code here
return;
}
super.actionPerformed(e);
}
};
}
}
}