Имя файла диалогового окна сохранения JFileChooser изменено или обработано перед вызовом AppSelection().

У меня есть класс FileSaver, который расширяет класс JFileChooser. Конструктор определяет некоторые файловые фильтры, устанавливает файловый фильтр по умолчанию и вызывает setAcceptAllFileFilterUsed(false). Когда пользователь нажимает кнопку, создается объект FileSaver и для него вызывается showSaveDialog(). Класс FileSaver переопределяет approveSelection(), чтобы он мог проверить введенное имя файла перед вызовом super.approveSelection().

Это нормально для большинства вводимых имен файлов, но если имя файла содержит вопросительный знак ("?") или звездочку ("*"), то approveSelection() не вызывается и создается новый файловый фильтр (и отображается установленным, в то время как программа в основном обрабатывает файловый фильтр в качестве предыдущей настройки) с именем файла в качестве описания. Можно ли обращаться с этими именами файлов так же, как с любыми другими (такими, что вызывается approveSelection() и соответственно устанавливается выбранный файл)?

Кроме того, кажется, что имя файла, содержащее косую черту ("/"), рассматривается как путь относительно текущего каталога, и поэтому getSelectedFile().getName() возвращает только часть имени файла после косой черты (или удаляет косую черту в конце имя файла) и часть перед добавлением к пути к каталогу. Может ли approveSelection() получить полное имя файла для проверки и не изменять каталог?


person Zyxl    schedule 14.04.2015    source источник
comment
Вместо того, чтобы описывать свой код в трех очень длинных абзацах, предоставьте MCVE.   -  person Guillaume Polet    schedule 14.04.2015


Ответы (1)


Попробуйте добавить этот класс в свой класс JFileChooser, этот класс реализует метод getApproveSelectionAction в WindowsFileChooserUI:

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

       }

}
person borchvm    schedule 23.12.2015
comment
Спасибо, я знал, что моя проблема, скорее всего, не будет решена тривиально. Хотя я больше не работаю над этим проектом, мне интересно узнать, как решить эту проблему. Я думаю, что хорошо понимаю ваш код и сумел адаптировать его для своего проекта, но когда я пытаюсь создать экземпляр MyFileChooser, я получаю NullPointerException при вызове super.setUI(new CustomFileChooserUI(this)). Любые мысли о том, почему это может быть? - person Zyxl; 28.12.2015