如何在创建JFileChooser对话框时选择默认的文件过滤器?

9

大家下午好,

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

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

我想默认选择“图像文件”过滤器。

如何为 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个回答

17

使用setFileFilter()方法:

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

为什么你要继承文件选择器而不是直接使用它?为什么你不遵循Java的命名规范(方法以小写字母开头)?为什么你不遵守Swing的线程策略,即Swing组件只能在EDT中使用。


在示例中添加了javax.swing.SwingUtilities.invokeLater。为什么方法应该使用camelCase而不是PascalCase? - Pacerier
Java代码规范 - mKorbel
因为这是Java中的标准约定。 - JB Nizet

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

1
请正确格式化您的代码,并在您的答案中添加一些细节。 - Dwhitz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接