4

我正在使用JFileChooser作为导出功能的一部分。我希望用户能够从JFileChooser的文件查看器中选择文件或在文件名文本框中输入文件名。根据我的阅读,可以使用该getSelectedFile()方法获取该值,因此我有一些侦听器会在执行导出之前调用getSelectedFile()并尝试进行一些检查。

我遇到的问题是,getSelectedFile()当我在文件名文本框中手动输入名称时,该方法返回 null。为了增加更多的混乱,该getSelectedFile()方法确实在三种不同的情况下工作:

  1. setSelectedFile()我通过(用户单击表中的值并使用setSelectedFile())填充它
  2. 我在文件查看器中单击现有文件
  3. 我在填充文件名文本框后按 ENTER

我有三个文件过滤器,但无论是否启用它们都具有相同的行为。

调用的监听器getSelectedFile()如下:

  • keyReleased 的事件监听器
  • mousePressed 的事件监听器。
  • 我的 jFileChooser 上的 PropertyChangeEvent 侦听器
  • 我的 jFileChooser 上的动作监听器

有没有更好的方法来收听我的 jFileChooser 以获取用户输入?我觉得我错过了一些非常明显的东西......感谢任何帮助!

编辑 更多信息...

我在 a 中有一个JFileChooser组件JSplitPane,它在 a 中JFrame。我不是打电话showOpenDialog来获取用户的输入。该组件可作为表单的一部分访问。

我想做的是在他/她打字时听用户输入。我有一个“开始导出”按钮,我想禁用它,直到用户在JFileChooser组件的文件名文本框中输入了有效的文件名。为此,我有一个 KeyEvent 侦听器,我想在用户输入文件名时使用它来获取文件名。

进一步编辑

这是动作监听器代码:

jFileChooserExport.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            jFileChooserExportActionPerformed(evt);
        }
    });

我这里还有一个属性更改监听器:

jFileChooserExport.addPropertyChangeListener(new java.beans.PropertyChangeListener() {
        public void propertyChange(java.beans.PropertyChangeEvent evt) {
            jFileChooserExportPropertyChange(evt);
        }
    });

在 jFileChooserExportPropertyChange 和 jFileChooserExportActionPerformed 内部,我试图通过调用 getSelectedFile() 来获取用户选择的文件。但是,在这两种情况下,它都保持为空,直到用户执行上述三种方法之一

4

2 回答 2

2

阅读 Swing 教程中有关如何使用文件选择器的部分。那里的演示代码对我来说很好用。

于 2011-02-09T16:08:57.133 回答
0

由于以下似乎都不起作用,您可能想尝试将 PropertyChangeListener 添加到您的 JFileChooser 中,以侦听SELECTED_FILE_CHANGED_PROPERTY


可能发生的情况是您的文件选择器可能启用了多选,在这种情况下getSelectedFile将返回 null,但getSelectedFiles将返回包含所选文件的数组。您可能想要禁用多选,或使用数组(如果您希望用户只选择一个文件,请将 multiSelectionEnabled 设置为 false)。

但是,另一种可能性是,如果您尝试获取选定的文件,但fileChooser.showOpenDialogfileChooser.showSaveDialog尚未调用或未返回JFileChooser.APPROVE_OPTION

另外,我相信 JFileChooser 是区分大小写的,所以如果文件名是“Foo.bar”并且你输入“Foo.bar”,它会认为你想要别的东西。

于 2011-02-09T16:22:21.163 回答