2012-02-20 38 views
7

下午好一切,如何在创建JFileChooser对话框时选择默认的FileFilter?

我有一个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); 
       } 
      }; 
     } 
    }); 
} 

回答

13

使用setFileFilter()

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

你为什么要继承文件选择,而不是仅仅使用它吗?为什么不尊重Java的命名约定(方法以小写字母开头)?为什么不尊重Swing的线程策略,即Swing组件只能在EDT中使用。

+0

在示例中添加了javax.swing.SwingUtilities.invokeLater。为什么方法应该是camelCased而不是PascalCased? – Pacerier 2012-02-20 10:43:39

+0

[Java的代码约定](http://www.oracle.com/technetwork/java/javase/documentation/codeconvtoc-136057.html) – mKorbel 2012-02-20 10:49:23

+0

因为这是Java中的标准约定。 – 2012-02-20 10:49:46

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

[请正确格式化您的代码](https://stackoverflow.com/editing-help),为您的答案添加一些细节。 – Dwhitz 2017-08-04 12:25:33

相关问题