javaswingfilechooserfilefilter

FileNameExtensionFilter adding file filters repeatedly


I have a file chooser demo like below, Assume I have coded inside 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();
}

When I click browse button first time it looks perfectly, but in 2nd time the file filters added with existing filters. Ho to avoid that!! Any help please. Thanks in advance!!


Solution

  • So, I assume if you have an instance field called chooser, so each time the ActionListener is called, it reconfigures the dialog over and over again. Instead, configure it once and simple re-use it

    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();
            }
        }
    }
    

    This is basically an example of lazy loading, where the JFileChooser isn't created until it's actually used, but it gets re-used as needed, which makes it faster