Нужен FileDialog с фильтром типов файлов в Java - PullRequest
4 голосов
/ 07 августа 2009

У меня есть 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)», но я не уверен, как это сделать.

Любая помощь приветствуется.

Ответы [ 6 ]

5 голосов
/ 07 августа 2009

, поскольку вы используете JDialog, это класс свинга, почему бы не использовать JFileChooser ?

 JFileChooser fc = new JFileChooser("C:\\");
 fc.setFileFilter(new FileNameExtensionFilter("Microsoft Word (*.doc, *.docx)", "doc", "docx"));

FileNameExtensionFilter - это класс Java 6, который делает именно то, что вы хотите.

5 голосов
/ 07 августа 2009

AWT на самом деле не является предпочтительным способом написания приложений с Java GUI. Солнце, кажется, в основном отказалось от него. Два самых популярных варианта - это Swing и SWT . Поэтому я думаю, что они на самом деле не разрабатывали API слишком широко, чтобы добавить современные функции. (эээ, чтобы ответить на ваш вопрос: Нет, вы не можете сделать это с помощью AWT)

Преимущество Swing в том, что он действительно записывается один раз в любом месте и везде может выглядеть одинаково. Есть Look & Feels, которые пытаются заставить Swing выглядеть нативно, некоторые лучше, чем другие (Mac не ужасен, Windows в порядке, GTK нет). Тем не менее, если вам нужно приложение, которое действительно выглядит и работает ТОЧНО везде одинаково, Swing позволит вам это сделать. Кроме того, он работает без каких-либо дополнительных библиотек. Производительность не велика.

Swing's JFileChooser позволит вам делать то, что вы хотите. Создайте подкласс FileFilter и вызовите setFileFilter на JFileChooser.

SWT переносит однократную запись в любое место в противоположную сторону. У вас все еще есть одна кодовая база, против которой вы пишете, но на самом деле она использует встроенные виджеты на каждой платформе, поэтому в целом она выглядит как собственное приложение (не везде идеальное, но все же впечатляющее). Это быстро и довольно надежно в моем опыте. Eclipse (и другое высококлассное программное обеспечение) использует SWT, поэтому он довольно интенсивно используется. Но для этого требуются специфичные для платформы JAR и DLL.

3 голосов
/ 04 октября 2012

Я тоже пытаюсь это сделать. Я хочу использовать 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);
2 голосов
/ 30 ноября 2012

Если вы когда-либо используете JavaFX 2 , класс FileChooser выполнит именно то, что вам нужно, без каких-либо проблем JFileChooser / FileDialog. Вы также можете встраивать компоненты JavaFX 2 в приложения Swing, но вам нужно JavaFX runtime .

Пример:

    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);
2 голосов
/ 14 января 2010

Вы можете вызвать собственный Filedialog для Windows (CFileDialog) с помощью JNI. Фильтры могут быть легко установлены для CFileDialog.

Я написал простой класс-обертку для CFileDialog несколько месяцев назад. Если вам интересно, вы можете получить исходный код и двоичный файл из

Проект Xfiledialog на Google Code

0 голосов
/ 06 октября 2017

Просто используйте 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");
                                }
                            });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...