JFileChooser打开常规文件浏览器而不是扩展文件浏览器

时间:2012-06-06 05:01:08

标签: java swing awt look-and-feel jfilechooser

按照我之前的两篇帖子here和另一篇one here,以下代码 打开常规文件浏览器而不是展开的文件:

public class GuiHandler extends javax.swing.JFrame {
    // data members
    private DataParser xmlParser = new DataParser();
    private File newFile;
    JFileChooser jfc = new JFileChooser();

    // more code 

    public void launchFileChooser() {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch(Exception e) {
                    e.printStackTrace();
                }
                jfc.setFileSelectionMode(JFileChooser.FILES_ONLY);
                jfc.setAcceptAllFileFilterUsed(false);
                if (jfc.showOpenDialog(null) == JFileChooser.APPROVE_OPTION)
                    newFile = jfc.getSelectedFile();
            }
        });
    }

    // more code 

    private void XMLfilesBrowserActionPerformed(java.awt.event.ActionEvent evt) {       
        launchFileChooser();
        xmlParser.getNodeListFromFile(newFile);
        // here the code has the below problems 

问题:

  1. 当我点击按钮open XML file时,代码会打开常规文件浏览器;它仍然允许我选择一个文件。
  2. 它引发了一个例外:
  3. Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: File cannot be null
        at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:198)
    

    如果jfc是数据成员,并且它是本地成员,为什么它会打开常规浏览器 变量,展开的变量?

2 个答案:

答案 0 :(得分:2)

关于常规文件选择器和扩展文件选择器,请务必在致电UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());之前致电new JFileChooser();。实际上,除非您允许用户在应用程序执行期间更改外观(L& F),否则在创建任何Swing组件之前,将L& F设置为接近应用程序执行的开始,就像在main方法中一样。根据我的经验,不这样做会导致一些奇怪的UI行为。

如果JFileChooser中有launchFileChooser作为本地变量,UIManager.setLookAndFeel之前会调用new JFileChooser。当JFileChooser是类成员变量(a.k.a。数据成员)时,UIManager.setLookAndFeel之后调用new JFileChooser;在后一种情况下,JFileChooser是在实例化GuiHandler的实例时创建的。


关于IllegalArgumentException使用SwingUtilities.invokeAndWait代替SwingUtilities.invokeLater而不是SSCE。更好的是,如果您确定launchFileChooser将始终出现在事件派发线程上,则无需调用launchFileChooserSwingUtilities.invokeAndWait


您可能还想使用文件过滤器:

SwingUtilities.invokeLater

以下是展示上述概念的{{3}}:

jfc.setFileFilter(new FileNameExtensionFilter("XML files (*.xml)", "xml"));

答案 1 :(得分:0)

我不确定'扩展的'是什么意思,但我假设你指的是文件过滤器。在没有任何文件过滤器的情况下,我猜测显示所有文件都是默认的。尝试在打开对话框之前添加以下代码。

jfc.setFileFilter(new javax.swing.filechooser.FileFilter(){
    public boolean accept(File f){
        return  f.isDirectory() || f.getName().toLowerCase().endsWith(".xml");
    }
    public String getDescription(){
        return "XML File";
    }
})