adjust selected File to FileFilter in a JFileChooser

前端 未结 8 728
死守一世寂寞
死守一世寂寞 2020-12-11 02:22

I\'m writing a diagram editor in java. This app has the option to export to various standard image formats such as .jpg, .png etc. When the user clicks File->Export, you get

8条回答
  •  [愿得一人]
    2020-12-11 02:53

    Here is my solution and it works fine. It maybe helps someone. You sould create your own "MyExtensionFileFilter" class, otherwise you have to modify the code.

    public class MyFileChooser extends JFileChooser {
        private File file = new File("");
    
        public MyFileChooser() {
            addPropertyChangeListener(JFileChooser.FILE_FILTER_CHANGED_PROPERTY, new PropertyChangeListener() {
                public void propertyChange(PropertyChangeEvent e) {
                    String filename = MyFileChooser.this.file.getName();
                    String extold = null;
                    String extnew = null;
                    if (e.getOldValue() == null || !(e.getOldValue() instanceof MyExtensionFileFilter)) {
                        return;
                    }
                    if (e.getNewValue() == null || !(e.getNewValue() instanceof MyExtensionFileFilter)) {
                        return;
                    }
                    MyExtensionFileFilter oldValue = ((MyExtensionFileFilter) e.getOldValue());
                    MyExtensionFileFilter newValue = ((MyExtensionFileFilter) e.getNewValue());
                    extold = oldValue.getExtension();
                    extnew = newValue.getExtension();
    
                    if (filename.endsWith(extold)) {
                        filename = filename.replace(extold, extnew);
                    } else {
                        filename += ("." + extnew);
                    }
                    setSelectedFile(new File(filename));
                }
            });
        }
    
        @Override
        public void setSelectedFile(File file) {
            super.setSelectedFile(file);
            if(getDialogType() == SAVE_DIALOG) {
                if(file != null) {
                    super.setSelectedFile(file);
                    this.file = file;
                }
            }
        }
    
        @Override
        public void approveSelection() { 
            if(getDialogType() == SAVE_DIALOG) {
                File f = getSelectedFile();  
                if (f.exists()) {  
                    String msg = "File existes ...";  
                    msg = MessageFormat.format(msg, new Object[] { f.getName() });  
                    int option = JOptionPane.showConfirmDialog(this, msg, "", JOptionPane.YES_NO_OPTION);
                    if (option == JOptionPane.NO_OPTION ) {  
                        return;  
                    }
                }
            }
            super.approveSelection();   
        }
    
        @Override
        public void setVisible(boolean visible) {
            super.setVisible(visible);
            if(!visible) {
                resetChoosableFileFilters();
            }
        }
    }
    

提交回复
热议问题