Как мне настроить JFileChooser для поведения одного клика в Java Swing? - PullRequest
2 голосов
/ 29 ноября 2008

Как изменить поведение JFileChooser с выбора двойным щелчком мыши на режим выбора одним щелчком мыши?

Я разрабатываю приложение для запуска либо с интерфейсом с одним щелчком мыши (ничего не требует двойного щелчка, как в режиме интерфейса KDE), либо с интерфейсом двойного щелчка (режим интерфейса Windows по умолчанию или обычный интерфейс GNOME Режим). Я хочу, чтобы приложение Java работало так же, как и остальная часть системы, с учетом текущей конфигурации и среды пользователя.

1 Ответ

0 голосов
/ 29 ноября 2008

Идеальное решение должно состоять в том, чтобы установить значение конфигурации где-нибудь в классе JFileChooser, чтобы оно работало либо в режиме двойного щелчка, либо в один клик.

Поскольку, похоже, такой конфигурации нет, вот примерное решение, основанное на идее Richie_W. Мне пришлось немного его расширить, чтобы позволить пользователю перемещаться по многим каталогам, а также чтобы избежать повторяющихся событий, которые запускаются при настройке выбора. Однако, как отметил Оскар, навигация с помощью клавиатуры невозможна (он всегда выбирает то, что находится в фокусе). Если вы не используете клавиатуру, она работает.

JFileChooser _fileChooser=new JFileChooser();

if (ConfigurationManager.isSingleClickDesired()) {
    //We will be interested in files only, but we need to allow it to choose both
    _fileChooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
    _fileChooser.addPropertyChangeListener(new PropertyChangeListener() {

      //To prevent reentry
  private boolean handlingEvent=false;

      public void propertyChange(PropertyChangeEvent e) {

        //Prevent reentry
        if (handlingEvent)
          return;
        else
          //Mark it as handling the event
          handlingEvent=true;

        String propertyName = e.getPropertyName();

        //We are interested in both event types
        if(propertyName.equals(JFileChooser.SELECTED_FILE_CHANGED_PROPERTY) ||
           propertyName.equals(JFileChooser.DIRECTORY_CHANGED_PROPERTY)){

        File selectedFile = (File) e.getNewValue();
        if (selectedFile!=null) {
          if (selectedFile.isDirectory()) {
            //Allow the user to navigate directories with single click
        _fileChooser.setCurrentDirectory(selectedFile);
          } else {
            _fileChooser.setSelectedFile(selectedFile);
            if (_fileChooser.getSelectedFile()!=null)
          //Accept it
          _fileChooser.approveSelection();
        } 
          } 
        }

 //Allow new events to be processed now
     handlingEvent=false;
    }
  }); 
} 

Ps-> Извините за не очень красивый формат кода, но StackoverFlow сломал поддержку форматов кода Firefox и Iceweasel в KDE и Gnome.

...