【问题标题】:JFileChooser save dialog filename is modified or acted upon before approveSelection() is called在调用approveSelection() 之前修改或操作JFileChooser 保存对话框文件名
【发布时间】:2015-04-14 19:30:52
【问题描述】:

我有一个扩展 JFileChooser 类的 FileSaver 类。构造函数定义一些文件过滤器,设置默认文件过滤器并调用setAcceptAllFileFilterUsed(false)。当用户单击按钮时,会创建一个 FileSaver 对象并为此调用 showSaveDialog()。 FileSaver 类覆盖approveSelection(),以便它可以在调用super.approveSelection() 之前验证输入的文件名。

这对于大多数输入的文件名都很好,但如果文件名包含问号(“?”)或星号(“*”),则不会调用 approveSelection() 并创建一个新的文件过滤器(并在该程序主要将文件过滤器视为其先前的设置)以文件名作为描述。是否可以像处理其他文件名一样处理这些文件名(例如调用 approveSelection() 并相应地设置所选文件)?

此外,似乎包含正斜杠(“/”)的文件名被视为相对于当前目录的路径,因此getSelectedFile().getName() 仅返回斜杠之后的文件名部分(或删除斜杠在文件名的末尾)和附加到目录路径之前的部分。 approveSelection() 是否可以检索完整的文件名以进行验证而不更改目录?

【问题讨论】:

  • 不要用 3 个很长的段落描述你的代码,而是提供一个MCVE

标签: java swing filenames jfilechooser file-writing


【解决方案1】:

尝试在你的 JFileChooser 类上添加这个类,这个类实现了 WindowsFileChooserUIgetApproveSelectionAction 方法:

   public class MyFileChooser extends JFileChooser{


      @Override
      protected void setUI(ComponentUI newUI) {
        super.setUI(new CustomFileChooserUI(this));
      }



      private static boolean isGlobPattern(String filename) {
                return ((File.separatorChar == '\\' && (filename.indexOf('*') >= 0
                                                          || filename.indexOf('?') >= 0))
                        || (File.separatorChar == '/' && (filename.indexOf('*') >= 0
                                                          || filename.indexOf('?') >= 0
                                                          || filename.indexOf('[') >= 0)));
       }

      public class CustomFileChooserUI extends WindowsFileChooserUI {

                JFileChooser jfileChooser;

                public CustomFileChooserUI(JFileChooser b) {
                  super(b);
                  jfileChooser = b;
                }

                @Override
                protected void createModel() {
                  super.createModel();
                }

                @Override
                public Action getApproveSelectionAction() {
                  return new ApproveSelectionAction() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                      String filename = getFileName();
                      if(isGlobPattern(filename)){
                        // your code here
                        return;
                      }
                      super.actionPerformed(e);
                    }
                  };
                }

       }

}

【讨论】:

  • 谢谢,我知道我的问题可能不会轻易解决。虽然我不再从事这个项目,但我很想知道如何解决这个问题。我想我对您的代码有很高的理解,并且已经设法将它改编为我的项目,但是当我尝试创建MyFileChooser 的实例时,我在调用super.setUI(new CustomFileChooserUI(this)) 时得到NullPointerException。关于为什么会这样的任何想法?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-24
  • 2011-05-20
  • 2017-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多