FileNameExtensionFilter 重复添加文件过滤器
FileNameExtensionFilter adding file filters repeatedly
我有一个如下所示的文件选择器演示,假设我已经在 browseButton.addActionListener()
中进行了编码
FileFilter docx = new FileNameExtensionFilter("MS Word file(.docx)", "docx");
FileFilter doc = new FileNameExtensionFilter("MS Word file(.doc)", "doc");
FileFilter pdf = new FileNameExtensionFilter("Pdf file(.pdf)", "pdf");
chooser.addChoosableFileFilter(docx);
chooser.addChoosableFileFilter(doc);
chooser.addChoosableFileFilter(pdf);
chooser.setFileFilter(docx);
chooser.setAcceptAllFileFilterUsed(false);
int ret = this.chooseLeft.showOpenDialog(chooserFrame);
if(ret == JFileChooser.APPROVE_OPTION){
try{
File leftFile = this.chooseLeft.getSelectedFile();
leftfileName = leftFile.getName().toLowerCase();
}catch(Exception e){
e.printStackTrace();
}
当我第一次单击浏览按钮时,它看起来很完美,但在第二次时,文件过滤器添加了现有过滤器。何避免这种情况!请任何帮助。提前致谢!!
因此,我假设如果您有一个名为 chooser
的实例字段,那么每次调用 ActionListener
时,它都会一遍又一遍地重新配置对话框。相反,配置一次并简单地重新使用它
private JFileChooser chooser;
//...
protected JFileChooser getFileChooser() {
if (chooser == null) {
chooser = new JFileChooser(...);
FileFilter docx = new FileNameExtensionFilter("MS Word file(.docx)", "docx");
FileFilter doc = new FileNameExtensionFilter("MS Word file(.doc)", "doc");
FileFilter pdf = new FileNameExtensionFilter("Pdf file(.pdf)", "pdf");
chooser.addChoosableFileFilter(docx);
chooser.addChoosableFileFilter(doc);
chooser.addChoosableFileFilter(pdf);
chooser.setFileFilter(docx);
chooser.setAcceptAllFileFilterUsed(false);
}
return chooser;
}
//...
public void actionPerformed(ActionEvent evt) {
JFileChooser chooser = getFileChooser();
int ret = chooser.showOpenDialog(chooserFrame);
if(ret == JFileChooser.APPROVE_OPTION){
try{
File leftFile = chooser.getSelectedFile();
leftfileName = leftFile.getName().toLowerCase();
}catch(Exception e){
e.printStackTrace();
}
}
}
这基本上是延迟加载的一个示例,其中 JFileChooser
在实际使用之前不会创建,但会根据需要重新使用,这使得速度更快
我有一个如下所示的文件选择器演示,假设我已经在 browseButton.addActionListener()
中进行了编码FileFilter docx = new FileNameExtensionFilter("MS Word file(.docx)", "docx");
FileFilter doc = new FileNameExtensionFilter("MS Word file(.doc)", "doc");
FileFilter pdf = new FileNameExtensionFilter("Pdf file(.pdf)", "pdf");
chooser.addChoosableFileFilter(docx);
chooser.addChoosableFileFilter(doc);
chooser.addChoosableFileFilter(pdf);
chooser.setFileFilter(docx);
chooser.setAcceptAllFileFilterUsed(false);
int ret = this.chooseLeft.showOpenDialog(chooserFrame);
if(ret == JFileChooser.APPROVE_OPTION){
try{
File leftFile = this.chooseLeft.getSelectedFile();
leftfileName = leftFile.getName().toLowerCase();
}catch(Exception e){
e.printStackTrace();
}
当我第一次单击浏览按钮时,它看起来很完美,但在第二次时,文件过滤器添加了现有过滤器。何避免这种情况!请任何帮助。提前致谢!!
因此,我假设如果您有一个名为 chooser
的实例字段,那么每次调用 ActionListener
时,它都会一遍又一遍地重新配置对话框。相反,配置一次并简单地重新使用它
private JFileChooser chooser;
//...
protected JFileChooser getFileChooser() {
if (chooser == null) {
chooser = new JFileChooser(...);
FileFilter docx = new FileNameExtensionFilter("MS Word file(.docx)", "docx");
FileFilter doc = new FileNameExtensionFilter("MS Word file(.doc)", "doc");
FileFilter pdf = new FileNameExtensionFilter("Pdf file(.pdf)", "pdf");
chooser.addChoosableFileFilter(docx);
chooser.addChoosableFileFilter(doc);
chooser.addChoosableFileFilter(pdf);
chooser.setFileFilter(docx);
chooser.setAcceptAllFileFilterUsed(false);
}
return chooser;
}
//...
public void actionPerformed(ActionEvent evt) {
JFileChooser chooser = getFileChooser();
int ret = chooser.showOpenDialog(chooserFrame);
if(ret == JFileChooser.APPROVE_OPTION){
try{
File leftFile = chooser.getSelectedFile();
leftfileName = leftFile.getName().toLowerCase();
}catch(Exception e){
e.printStackTrace();
}
}
}
这基本上是延迟加载的一个示例,其中 JFileChooser
在实际使用之前不会创建,但会根据需要重新使用,这使得速度更快