Java 8 может, наконец, принести решение этой проблемы, но, к сожалению (для приложений Swing), оно приходит только как класс JavaFX FileChooser :
Я тестировал этот код с здесь и это действительно всплывающее современное диалоговое окно (здесь Windows 7):
FileChooser fileChooser = new FileChooser();
//Set extension filter
FileChooser.ExtensionFilter extFilterJPG = new FileChooser.ExtensionFilter("JPG files (*.jpg)", "*.JPG");
FileChooser.ExtensionFilter extFilterPNG = new FileChooser.ExtensionFilter("PNG files (*.png)", "*.PNG");
fileChooser.getExtensionFilters().addAll(extFilterJPG, extFilterPNG);
//Show open file dialog
File file = fileChooser.showOpenDialog(null);
Чтобы интегрировать это в приложение Swing, вам нужно будет запустить его в потоке javafx через Platform.runLater
(как видно здесь ).
Обратите внимание, что для этого потребуется инициализация потока javafx (в данном примере это делается при инициализации сцены в new JFXPanel()
).
Подводя итог, можно сказать, что готовое решение в Swing-приложении будет выглядеть так:
new JFXPanel(); // used for initializing javafx thread (ideally called once)
Platform.runLater(() -> {
FileChooser fileChooser = new FileChooser();
//Set extension filter
FileChooser.ExtensionFilter extFilterJPG = new FileChooser.ExtensionFilter("JPG files (*.jpg)", "*.JPG");
FileChooser.ExtensionFilter extFilterPNG = new FileChooser.ExtensionFilter("PNG files (*.png)", "*.PNG");
fileChooser.getExtensionFilters().addAll(extFilterJPG, extFilterPNG);
//Show open file dialog
File file = fileChooser.showOpenDialog(null);
});