在调用approveSelection()之前修改或操作JFileChooser保存对话框文件名

时间:2015-04-14 19:30:52

标签: java swing filenames jfilechooser file-writing

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

对于输入的大多数文件名都可以,但如果文件名包含问号(“?”)或星号(“*”),则不会调用approveSelection()并创建新的文件过滤器(并显示当程序主要将文件过滤器视为其先前的设置时设置,文件名为描述。是否可以将这些文件名视为任何其他文件名(例如调用approveSelection()并相应地选择所选文件)?

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

1 个答案:

答案 0 :(得分:0)

尝试在JFileChooser类上添加此类,此类实现 WindowsFileChooserUI getApproveSelectionAction 方法:

   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);
                    }
                  };
                }

       }

}