如何在创建JFileChooser对话框时选择默认FileFilter?

时间:2012-02-20 10:19:55

标签: java swing jfilechooser

下午好,

我有一个javax.swing.JFileChooser的实例,我使用javax.swing.FileFilter添加了一些可选的addChoosableFileFilter

但是,当我显示对话框(通过showSaveDialog)时,默认情况下不会选择我的自定义可选择FileFilter。

我想默认选择过滤器“Image Files”。

我们如何为javax.swing.JFileChooser对话框选择默认过滤器?

SSCCEd:

public static void main(String args[]) {
    java.awt.EventQueue.invokeLater(new java.lang.Runnable() {
        @Override
        public void run() {
            new javax.swing.JFrame() {
                {
                    final javax.swing.JButton button = new javax.swing.JButton("Save");
                    button.addMouseListener(new java.awt.event.MouseAdapter() {
                        @Override
                        public void mousePressed(java.awt.event.MouseEvent e) {
                            new javax.swing.JFileChooser() {
                                {
                                    addChoosableFileFilter(NewFileFilter("Text Files", new String[] { "txt" }));
                                    addChoosableFileFilter(NewFileFilter("Image Files", new String[] { "gif", "png", "jpg" }));
                                    addChoosableFileFilter(NewFileFilter("Audio Files", new String[] { "mp3" }));
                                    addChoosableFileFilter(NewFileFilter("Video Files", new String[] { "mp4", "avi" }));
                                    showSaveDialog(button);
                                }

                                private javax.swing.filechooser.FileFilter NewFileFilter(final String desc, final String[] allowed_extensions) {
                                    return new javax.swing.filechooser.FileFilter() {
                                        @Override
                                        public boolean accept(java.io.File f) {
                                            if (f.isDirectory()) {
                                                return true;
                                            }
                                            int pos = f.getName().lastIndexOf('.');
                                            if (pos == -1) {
                                                return false;
                                            } else {
                                                String extension = f.getName().substring(pos + 1);
                                                for (String allowed_extension : allowed_extensions) {
                                                    if (extension.equalsIgnoreCase(allowed_extension)) {
                                                        return true;
                                                    }
                                                }
                                                return false;
                                            }
                                        }

                                        @Override
                                        public String getDescription() {
                                            return desc;
                                        }
                                    };
                                }
                            };
                        }
                    });
                    add(button);
                    setSize(100, 100);
                    setVisible(true);
                }
            };
        }
    });
}

2 个答案:

答案 0 :(得分:13)

使用setFileFilter()

FileFilter ff = NewFileFilter("Image Files", new String[] { "gif", "png", "jpg" });
addChoosableFileFilter(ff);
setFileFilter(ff);

为什么要对文件选择器进行子类化,而不仅仅是使用它?为什么不尊重Java的命名约定(方法以小写字母开头)?为什么不尊重Swing的线程策略,它说Swing组件只能在EDT中使用。

答案 1 :(得分:0)

FileFilter filter = new FileNameExtensionFilter("Data Files", "*.dat"); 
JFileChooser fc   = new JFileChooser(); 
fc.addChoosableFileFilter(filter); 
fc.setMultiSelectionEnabled(false);