Вопрос

У меня есть 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. Если вам интересно, вы можете получить исходный код и двоичный файл из

Проект Xfiledialog в коде Google

Если вы когда-нибудь воспользуетесь 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");
                                }
                            });
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top