JFileChooser 设置目录

Posted

技术标签:

【中文标题】JFileChooser 设置目录【英文标题】:JFileChooser set directory 【发布时间】:2019-12-21 18:35:31 【问题描述】:

我正在尝试设置我的JFileChooser 应该显示的目录。我正在尝试使用 setCurrentDirectory 方法:

public class FileChooser 
    public static void main(String[] args)         
        JFrame jf = new JFrame();
        JFileChooser chooser = new JFileChooser();

        jf.add(chooser);
        jf.setVisible(true);
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jf.pack();

        File file = new File("C:\\");

        if(file.exists() && chooser != null) 
            chooser.setCurrentDirectory(file);
        
    

这是奇怪的部分:

当我运行我的程序时,一切正常。但是当我再次尝试运行它时,它有时会抛出一个NullPointerException。这可以在第一次重新运行后发生,也可以连续工作 10 次。没有模式。 我没有修改我的C: 目录。

这是完整的代码,没有被截断。

完整的堆栈跟踪:

Exception in thread "main" java.lang.NullPointerException
at javax.swing.plaf.basic.BasicListUI.updateLayoutState(BasicListUI.java:1368)
at javax.swing.plaf.basic.BasicListUI.maybeUpdateLayoutState(BasicListUI.java:1311)
at javax.swing.plaf.basic.BasicListUI.getCellBounds(BasicListUI.java:952)
at javax.swing.JList.getCellBounds(JList.java:1637)
at javax.swing.JList.ensureIndexIsVisible(JList.java:1149)
at sun.swing.FilePane.ensureIndexIsVisible(FilePane.java:1708)
at sun.swing.FilePane.doDirectoryChanged(FilePane.java:1631)
at sun.swing.FilePane.propertyChange(FilePane.java:1681)
at java.beans.PropertyChangeSupport.fire(PropertyChangeSupport.java:335)
at java.beans.PropertyChangeSupport.firePropertyChange(PropertyChangeSupport.java:327)
at java.beans.PropertyChangeSupport.firePropertyChange(PropertyChangeSupport.java:263)
at java.awt.Component.firePropertyChange(Component.java:8434)
at javax.swing.JFileChooser.setCurrentDirectory(JFileChooser.java:598)
at filechooser.FileChooser.main(FileChooser.java:21)

当我尝试通过构造函数JFileChooser(String currentDirectoryPath) 设置目录时,一切正常。即使我连续尝试了 100 次(相信我,我尝试了 100 次)。代码:

public class FileChooser 
    public static void main(String[] args)         
        JFrame jf = new JFrame();
        JFileChooser chooser = new JFileChooser("C:\\");

        jf.add(chooser);
        jf.setVisible(true);
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jf.pack();
    

所以chooser.setCurrentDirectory(new File("C:\\"));一定有问题 我无法使用构造函数。我必须设置 currentDirectory。

Exception被抛出时,getCurrentDirectory()返回C:\,即使我的FileChooser没有显示这个目录。

有人知道这里发生了什么吗?

【问题讨论】:

Swing GUI 应该在事件调度线程上构建和更改。这样做,我敢打赌 NPE 会消失。 查阅教程:How to Use File Choosers 或Javadoc - 它不应该(轻松)添加到组件中,(我无法在我的系统上重现 NPE,我可以看到选择器) 【参考方案1】:

感谢Andrew Thompson,我得到了它的工作。我不得不更换

chooser.setCurrentDirectory(file);

SwingUtilities.invokeLater(() -> chooser.setCurrentDirectory(new File("C:\\")));

【讨论】:

以上是关于JFileChooser 设置目录的主要内容,如果未能解决你的问题,请参考以下文章

Swing-JFileChooser的使用

如何将 JFileChooser 限制为目录?

为 JFileChooser 上的选定文件设置自己的文件图标

以编程方式为 JFileChooser 设置文件过滤器

在 MacOS X 上使用 FileDialog 而不是 JFileChooser 用于文件和目录

使用 JFileChooser 保存