Идеальное решение должно состоять в том, чтобы установить значение конфигурации где-нибудь в классе 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.