Нужен FileDialog с фильтром типов файлов в Java
-
12-09-2019 - |
Вопрос
У меня есть JDialog с кнопкой/текстовым полем, позволяющим пользователю выбрать файл.Вот код:
FileDialog chooser = new FileDialog(this, "Save As", FileDialog.SAVE );
String startDir = saveAsField.getText().substring( 0, saveAsField.getText().lastIndexOf('\\') );
chooser.setDirectory(startDir);
chooser.setVisible(true);
String fileName = chooser.getFile();
Моя проблема в том, что вместо просмотра фильтра «Все файлы» я хочу предоставить собственный фильтр, например.для документов Word или чего-то еще.Я установил собственный FilenameFilter с помощью setFilenameFilter(), но, похоже, он не сработал.Я заметил, что в документации сказано, что пользовательский фильтр не работает в Windows (он работает в Windows XP/Vista/7).Вот моя реализация фильтра:
chooser.setFilenameFilter( new geFilter() );
public class geFilter implements FilenameFilter {
public boolean accept(File dir, String name) {
return name.endsWith( ".doc" ) || name.endsWith( ".docx" );
}
}
Я делаю здесь что-то не так?Кроме того, я хочу, чтобы в поле отображалось описание, например «Microsoft Word (*.doc *.docx)», но я не знаю, как это сделать.
Любая помощь приветствуется.
Решение
В настоящее время AWT не является предпочтительным способом написания приложений с графическим интерфейсом Java.Судя по всему, Sun в основном отказалась от этого.Двумя наиболее популярными вариантами являются Swing и SWT.Поэтому я думаю, что они не очень тщательно разрабатывали API для добавления современных функций.(эээ, чтобы ответить на ваш вопрос:Нет, похоже, вы не сможете сделать это с AWT)
Преимущество Swing заключается в том, что он действительно работает по принципу «запись-один раз-запуск» где угодно и может везде выглядеть одинаково.Существуют Look & Feels, которые пытаются сделать Swing нативным, некоторые из них лучше других (Mac не так уж и плох, Windows — в порядке, GTK — нет).Тем не менее, если вы хотите, чтобы приложение действительно выглядело и действовало ТОЧНО одинаково везде, Swing позволит вам это сделать.Плюс он работает «из коробки» без каких-либо дополнительных библиотек.Производительность не очень хорошая.
Качели JFileChooser позволит вам делать то, что вы хотите.Создайте подкласс ФайлФильтр и позвони setFileFilter
на JFileChooser
.
SWT доводит принцип «запись-один раз-запуск где угодно» до противоположной крайности.У вас все еще есть одна база кода, на которую вы пишете, но на самом деле она использует собственные виджеты на каждой платформе, поэтому в целом она выглядит как нативное приложение (не везде идеальное, но все равно впечатляющее).По моему опыту, это быстро и довольно надежно.Eclipse (и другое высококлассное программное обеспечение) использует SWT, поэтому он используется довольно интенсивно.Но для этого требуются JAR-файлы и библиотеки DLL, специфичные для платформы.
Другие советы
поскольку вы используете JDialog, это класс Swing, почему бы не использовать JFileChooser?
JFileChooser fc = new JFileChooser("C:\\");
fc.setFileFilter(new FileNameExtensionFilter("Microsoft Word (*.doc, *.docx)", "doc", "docx"));
ИмяФайлаРасширениеФильтр — хороший класс Java 6, который делает именно то, что вы хотите.
Я тоже пытаюсь это сделать.Я хочу использовать FileDialog вместо JFileChooser.
Я нашел ответ здесь: http://www.rgagnon.com/javadetails/java-0247.html
Он говорит, что «на платформе Win метод setFilenameFilter не работает.Вместо этого мы должны использовать метод setFile, чтобы установить фильтр».
Исходный код находится по указанной ссылке.
Я протестировал, и это работает:
FileDialog fd = new FileDialog((Frame) null, "Save File", FileDialog.SAVE);
fd.setFile("*.txt");
fd.setVisible(true);
String file = fd.getFile();
System.out.println(file);
System.exit(0);
Вы можете вызвать собственный Windows Filedialog (CFileDialog) с помощью JNI.Для CFileDialog можно легко установить фильтры.
Несколько месяцев назад я написал простой класс-оболочку для CFileDialog. Если вам интересно, вы можете получить исходный код и двоичный файл из
Если вы когда-нибудь воспользуетесь JavaFX 2, FileChooser class будет делать именно то, что вам нужно, без каких-либо проблем с JFileChooser/FileDialog.Вы также можете встраивать компоненты JavaFX 2 в приложения Swing, но вам нужно среда выполнения JavaFX.
Пример:
FileChooser fc = new FileChooser();
FileChooser.ExtensionFilter filter;
filter = new FileChooser.ExtensionFilter("Text files (*.txt)", "*.txt");
fc.getExtensionFilters().add(filter);
File f = fc.showOpenDialog(primaryStage);
System.out.println(f);
Просто используйте setFilenameFilter
метод FileDialog
пример fd
:
fd.setFilenameFilter(new FilenameFilter()
{
@Override
public boolean accept(File file, String s)
{
// enter code to return TRUE or FALSE here
return s.contains(".txt");
}
});