FileNameExtensionFilter重复添加文件筛选器

时间:2016-05-04 10:24:39

标签: java swing filechooser filefilter

我有一个文件选择器演示如下,假设我已在browseButton.addActionListener()中编码

c = Content.objects.filter(content_type='q')
v = {obj.user_id: obj.value for obj in Vote.objects.filter(user=1, content__in=c)}
for obj in c:
    obj.is_upvote = v.get(obj.id, 0) == 1
    obj.is_downvote = v.get(obj.id, 0) == -1

当我第一次单击“浏览”按钮时,它看起来很完美,但是第二次使用现有过滤器添加了文件过滤器。何以避免!请帮忙。在此先感谢!!

1 个答案:

答案 0 :(得分:2)

所以,我假设您有一个名为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在实际使用之前不会被创建,但它会根据需要重新使用,这会使其更快