如何监听JFileChooser中“文件名”文本字段的更改?

4
我需要在javax.swing.JFileChooser的标记为“文件名”的文本框中获取最新的输入文本。我不需要最后选定的文件,因为在“文件名”中键入的文本应该作为新创建文件的名称。
我使用了SELECTED_FILE_CHANGED_PROPERTY,但它仅在选择文件时触发。还有FILE_FILTER_CHANGED_PROPERTY,但当我更改文件类型时才会触发。
如何监听“文件名”文本框的更改?
谢谢!
3个回答

2
注意:仅当选择单个项目时,才会触发“SELECTED_FILE_CHANGED_PROPERTY”事件。
特别地,在启用多选模式时选择多个项目时,不会触发此事件。但是,如果在多选模式下选择单个项目,则会触发此事件。
在多选模式下,无论选择了单个文件还是多个文件,“SELECTED_FILES_CHANGED_PROPERTY”事件始终会被触发。
JFileChooser chooser = new JFileChooser();

// Add listener on chooser to detect changes to selected file
chooser.addPropertyChangeListener(new PropertyChangeListener() {
    public void propertyChange(PropertyChangeEvent evt) {
        if (JFileChooser.SELECTED_FILE_CHANGED_PROPERTY
                .equals(evt.getPropertyName())) {
            JFileChooser chooser = (JFileChooser)evt.getSource();
            File oldFile = (File)evt.getOldValue();
            File newFile = (File)evt.getNewValue();

            // The selected file should always be the same as newFile
            File curFile = chooser.getSelectedFile();
        } else if (JFileChooser.SELECTED_FILES_CHANGED_PROPERTY.equals(
                evt.getPropertyName())) {
            JFileChooser chooser = (JFileChooser)evt.getSource();
            File[] oldFiles = (File[])evt.getOldValue();
            File[] newFiles = (File[])evt.getNewValue();

            // Get list of selected files
            // The selected files should always be the same as newFiles
            File[] files = chooser.getSelectedFiles();
        }
    }
}) ;

@das_j> 你说得对。我会更新我的答案,请稍后查看。 - Mohsen Kamrani
非常感谢。但是我需要从JFileChooser中标记为“文件名”的textField获取文本。用户可能根本不选择任何文件,而只输入文件名,程序应该创建这样的文件。 - Volodymyr Levytskyi
@Volodia> 你是想要类似安装程序的功能,如果选中一个不存在的文件夹,则创建该文件夹吗? - Mohsen Kamrani
我想创建一个文件,其名称是在文本字段“文件名”中键入的,但仅在用户按下JFileChooser上的“批准”按钮后。 - Volodymyr Levytskyi
单选模式下触发SELECTED_FILE_CHANGED_PROPERTY事件!我已经确认了! - Volodymyr Levytskyi

1
你需要的是带有 SAVE_DIALOG 标志的 JFileChooser
以下是一些演示代码:
JFileChooser chooser = new JFileChooser("some path");
chooser.setDialogType(JFileChooser.SAVE_DIALOG);
// Stuff like setting the required file extension, the title, ...
int result = chooser.showSaveDialog(this);
if (result == JFileChooser.APPROVE_OPTION) {
    String path = chooser.getSelectedFile().toString();
    // Do something with the path
}
chooser.setVisible(false); // Don't forget to hide

0
我通过使用另一个类似问题的答案的主要概念,成功地使其工作。
private JTextField getFilenameTextField(Container cont)
{
  for (Component c : cont.getComponents())
  {
    if (c instanceof JTextField)
    {
      return (JTextField)c;
    }
    else if (c instanceof Container)
    {
      JTextField textField = getFilenameTextField(((Container) c));
      if (textField != null) return textField;
    }
  }
  return null;
}

这将以一个容器(在这种情况下,一个JFileChooser对象)作为参数,并递归搜索它的每个组件和子组件,直到找到JTextField。如果由于某种原因找不到,将返回null。然而,这应该可以正常工作,因为标准的JFileChooser应该始终只有一个文本字段。
然后,您可以获取文本字段对象并向其添加一个文档监听器,以跟踪文本更改的情况:
JFileChooser chooser = new JFileChooser();
JTextField filenameTextField = getFilenameTextField(chooser);
filenameTextField.getDocument().addDocumentListener(new DocumentListener()
{
  // implement the methods
});

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