Java диалог выбора файла

Обновлено: 03.07.2024

[an error occurred while processing this directive]

Конспект лекций по Java. Занятие 16

[an error occurred while processing this directive](none) [an error occurred while processing this directive](none)[an error occurred while processing this directive] ::
[an error occurred while processing this directive] (none)
[an error occurred while processing this directive] ([an error occurred while processing this directive] В.Фесюнов [an error occurred while processing this directive])

[an error occurred while processing this directive](none)

Интерфейс FileFilter

Среди методов класса File , рассмотренного нами на прошлом занятии есть метод

public File[] listFiles(FileFilter filter)

В отличие от одноименного метода, но без параметра, этот метод отбирает не все файлы данного каталога, а только те, которые удовлетворяют определенному условию. Параметр filter предназначен для задания этого условия. При этом тип параметра ( FileFilter ) — это не класс, а интерфейс.

Обратимся к документации по интерфейсу FileFilter . Мы увидим, что данный интерфейс имеет всего один метод

public boolean accept(File pathname)

Этот метод должен возвращать true , если файл нам подходит, и false , если нет.

С таким приемом программирования мы еще не встречались. Разберем его подробнее.

Метод listFiles будет вызывать метод accept для каждого файла в каталоге, и те, для которых accept вернет true , будут включены в результирующий список. Остальные будут проигнорированы.

Для использования этих возможностей нам нужно построить класс, удовлетворяющий интерфейсу FileFilter , и определить в нем соответствующий метод accept .

Практическая работа

В качестве примера использования FileFilter модифицируем программу DirClean (рассматривали на прошлом занятии). Сейчас программа принимает только один параметр — имя каталога и удаляет все файлы в этом каталоге.

Расширим возможности программы DirClean .

Программа должна принимать один или два параметра. Если параметр один, она должна работать так же, как и раньше. Если задан второй параметр, то он задает расширение удаляемых файлов, и тогда программа должна удалять только те файлы, которые имеют указанное расширение.

1. Нам нужно создать класс, удовлетворяющий интерфейсу FileFilter . Определим статический вложенный класс ExtFilter .

2. Определим в классе ExtFilter метод accept

3. Здесь для получения расширения файла используется другой метод — getExtension , который нам тоже нужно реализовать.

В данном методе при помощи вызова getPath мы получаем полное имя файла в виде строки. Потом, используя метод lastIndexOf класса String мы определяем позицию последней точки в строке имени файла и вырезаем из строки подстроку от последней точки до конца строки.

4. Кроме метода getExtension в методе accept присутствует переменная ext . Эта переменная должна быть полем нашего класса. Этому полю будет присваиваться значение второго параметра вызова программы в конструкторе класса ExtFilter . Окончательный вид класса ExtFilter такой

5. Теперь осталось реализовать использование класса ExtFilter в нашей программе. Для этого строку

File[] fList = dir.listFiles();

предназначенную для получения списка файлов каталога заменим на следующую

File[] fList = dir.listFiles(args.length < 2 ? null : new ExtFilter(args[1]));

Т.е. в метод listFiles будет передаваться либо null , если нет второго параметра, либо объект класса ExtFilter , если он есть.

Результирующая программа выглядит так

Оттранслируем и запустим данную программу.

На этом рассмотрение собственно библиотеки ввода/вывода Java мы закончим.

Класс JFileChooser

После знакомства с вводом/выводом в Java уместно рассмотреть диалоговые возможности библиотеки языка, имеющие отношение к вводу/выводу.

Мы рассмотрим класс JFileChooser пакета javax.swing , который позволяет организовать стандартный диалог выбора файла для чтения или сохранения.

Внешний вид такого диалога примерно следующий.

Как видно из рисунка он похож на внешний вид стандартного окна открытия файла, с которым любому из пользователей приходилось сталкиваться неоднократно.

Познакомимся с классом JFileChooser более подробно.

Организует диалог начиная с текущего каталога.

Организует диалог начиная с указанного каталога.

То же самое, но каталог указывается объектом класса File.

Рассмотрим пример, поставляемый в составе пакета jdk1.3 (C:\jdk1.3\demo\jfc\FileChooserDemo\src\), в работе.

Этот пример демонстрирует многие возможности класса JFileChooser . Выбирая различные опции, мы можем увидеть, какие возможности реализует данный класс.

Разберемся, как использовать класс JFileChooser на примере простейшего редактора текстовых файлов.

Данный пример не закончен. В нем реализовано только чтение исходного файла. Для сохранения файла в нем предусмотрен метод save , но он не реализован.

Для того чтобы разобраться в программе, рассмотрим методы класса JFileChooser , предназначенные для организации диалога. Это методы

Диалог открытия файла на чтение.

Диалог открытия файла на запись.

В обоих методах требуется параметр — тот компонент (окно), из которого вызван данный диалог. В нашем случае это должен быть главный JFrame программы, т.е. this .

Работа с классом JFileChooser сосредоточена в методе open :

Здесь, сначала создается объект класса JFileChooser , потом устанавливаются фильтры (рассмотрим ниже), после чего организуется собственно диалог методом showOpenDialog , которому в качестве параметра передается основной фрейм нашего приложения ( this ).

Методы showOpenDialog и showSaveDialog организуют диалог с пользователем и в качестве результата возвращают целое значение (статус), описывающее, что сделал пользователь.

- сделать выбор: JFileChooser.APPROVE_OPTION

- могла возникнуть ошибка: JFileCHooser.ERROR_OPTION

Дальнейшие действия программы выполняются, только если все в порядке, т.е., если пользователь выбрал файл. В этом случае мы можем получить ссылку на этот файл в виде объекта класса File с помощью метода getSelectedFile . После этого остается открыть поток ( FileReader в нашем случае), используя подходящий конструктор и ввести файл.

Класс JFileChooser имеет много возможностей настройки диалога. Так в нашей программе нам пришлось проверять, что пользователь выбрал именно файл, а не каталог. Это можно было бы обеспечить иначе — при помощи метода

public void setFileSelectionMode(int mode);

Здесь mode может принимать одно из значений:

  • JFileChooser.FILES_ONLY — только файлы
  • JFileChooser.DIRECTORIES_ONLY — только каталоги
  • JFileChooser.FILES_AND_DIRECTORIES — и те и другие

Т.е. можно было бы вставить строку

и не делать проверку " f.isFile() ".

Очень часто при организации такого диалога используются фильтры отбора файлов.

Для манипулирования фильтрами в JFileChooser имеются следующие методы:

Добавляет новый фильтр

Удаляет заданный фильтр

Удаляет все фильтры

Устанавливает/запрещает режим использования фильтра "*.* — AcceptAll " (все файлы).

По умолчанию всегда установлен фильтр AcceptAll . К нему можно добавить новые фильтры, используя addChoosableFileFilter , фильтр AcceptAll можно отключить при помощи вызова:

Теперь, разберемся, что такое здесь FileFilter .

Это не интерфейс FileFilter из пакета java.io, который мы рассматривали ранее. Это абстрактный класс из пакета javax.swing.filechooser . Он имеет два метода:

Метод для проверки, подходит ли данный файл под заданный фильтр.

Метод, задающий текст для диалога выбора фильтра.

Т.е. по сравнению с интерфейсом FileFilter из пакета java.io данный класс имеет дополнительный метод getDescription . Этот метод используется классом JFileChooser для отображения наименования фильтра в нижнем окошке. В остальном класс ExtFileFilter построен очень похоже на класс ExtFilter из предыдущего примера.

Поскольку в нашей программе используется пакет java.io , то при указании имени класса FileFilter приходится указывать полное имя, т.к. иначе транслятор не может определить, какой из двух FileFilter нам нужен.

Задание

1. Рассмотреть подробно данную программу.

2. Убрать фильтр отбора всех файлов.

3. Сделать фильтр отбора текстовых файлов фильтром по умолчанию (см.документацию).

4. Реализовать сохранение файла (реализовать метод save ).

Swing включает мощное средство для работы с файлами — компонент JFileChooser —, представляющий контейнер, в котором расположены несколько компонентов, списков и кнопок, «управляющих» выбором файлов. JFileChooser можно добавить в любое место пользовательского интерфейса, поскольку это весьма гибкий компонент, позволяющий тонко настраивать внешний вид. При необходимости можно полностью изменить стандартное расположение входящих в JFileChooser компонентов и добавить дополнительные элементы, такие как панели предварительного просмотра файлов.

Все стандартные диалоговые окна Swing имеют собственные UI-представители, отвечающие за интерфейс окна в используемом приложении. Это особенно важно для внешних видов окон, имитирующих известные платформы, пользователи которых не должны ощущать значительной разницы при переходе от «родных» приложений к Java-приложения. UIManager позволяет выполнять настройку и локализацию интерфейса диалогового окна JFileChooser.

Начиная с выпуска JDK 1.3 библиотека Swing предлагает легко настраиваемый инструмент JFileChooser для выбора файлов и при необходимости каталогов. Особенности различных файловых систем скрыты в подклассах абстрактного класса FileSystemView, который представляет внешний вид файловой структуры согласно используемой операционной системе.

JFileChooser — это обычный компонент, унаследованный от класса JComponent, так что можно включить его в любое место интерфейса. Настроить и вывести на экран несложное диалоговое окно для открытия файла или сохранения в нем данных совсем легко.

Конструкторы JFileChooser

Основные метод JFileChooser

МетодОписание
File getCurrentDirectory() Функция чтения текущей директории
String getDialogTitle() Функция чтения заголовка окна
int getDialogType() Функция чтения типа диалогового окна
FileFilter getFileFilter() Функция чтения текущего фильтра
File getSelectedFile() Функция чтения выделенного файла
File[] getSelectedFiles() Функция получения списка выделенных файлов, если установлен флаг выделения нескольких файлов MULTI_SELECTION_ENABLED_CHANGED_PROPERTY
void setCurrentDirectory(File dir) Метод определения текущей директории
void setDialogTitle(String dialogTitle) Метод определения заголовка диалогового окна
void setDialogType(int dialogType) Метод определения типа диалогового окна
void setFileFilter(FileFilter filter) Метод установки файлового фильтра
void setFileSelectionMode(int mode) Метод определения выделяемых объектов - файлы, директории или файлы с директориями
void setMultiSelectionEnabled(boolean b) Метод определения возможности выделения нескольких файлов
void setSelectedFile(File file) Метод выделения файла
void setSelectedFiles(File[] selectedFiles) Метод выделения списка файлов, если установлен флаг выделения нескольких файлов MULTI_SELECTION_ENABLED_CHANGED_PROPERTY
int showDialog(Component parent, String approveButtonText) Функция открытия окна выбора файла с настроенным наименованием кнопки
int showOpenDialog(Component parent) Функция открытия диалогового окна «Открыть файл»
int showSaveDialog(Component parent) Функция открытия диалогового окна «Сохранить файл»

Режимы работы JFileChooser

Перед открытием диалогового окна для выбора файлов или директории необходимо определить режим работы JFileChooser. Компонент JFileChooser может работать в одном из трех режимов, который сохраняется в свойстве fileSelectionMode :

  • FILES_ONLY - доступны только файлы, независимо от того, сохраняется файл или открывается. По умолчанию JFileChooser работает именно в этом режиме.
  • FILES_AND_DIRECTORIES - доступны каталоги и файлы. Этот режим следует использовать только в том случае, когда необходимо поменять общие свойства файловой системы (файлы не отличаются от каталогов).
  • DIRECTORIES_ONLY - доступны только каталоги.

Для определения режима используется метод setFileSelectionMode(mode).

Возвращаемые компонентом JFileChooser значения

  • APPROVE_OPTION - выбор файла в диалоговом окне прошел успешно; выбранный файл можно получить методом getFile();
  • CANCEL_OPTION - выбор файла отменен нажатием на кнопке Cancel;
  • ERROR_OPTION - при выборе файла произошла ошибка, или было закрыто диалоговое окно выбора файла.

Пример использования JFileChooser

В примере FileChooserTest.java используется диалоговое окно выбора файла и директории с использованием компонента JFileChooser. Интерфейс окна включает 3 кнопки, по нажатию на которые открывается соответствующее диалоговое окно. Интерфейс главного окна представлен на следующем скриншоте.


Листинг примера JFileChooser

В примере определены кнопки, компонент выбора файла fileChooser и параметры файлового фильтра FILTERS. В конструкторе определяется интерфейс окна и вызывается метод addFileChooserListeners() для подключения к кнопкам слушателей.

Следует отметить, что компоненты диалогового окна локализованы с использованием метода put менеджера пользовательского интерфейса UIManager библиотеки Swing.

Листинг метода addFileChooserListeners

В методе addFileChooserListeners() к каждой кнопке подключается свой слушатель, который формирует собственное диалоговое окно с определенными настройками.

Выбор директории

В коде определяется заголовок окна и режим открытия (JFileChooser.DIRECTORIES_ONLY). Интерфейс окна JFileChooser в режиме выбора директории представлен на следующем скриншоте.


Сохранение файла

В коде определяется заголовок окна и режим открытия (JFileChooser.FILES_ONLY). Интерфейс окна JFileChooser в режиме сохранения файла представлен на следующем скриншоте.


Использование фильтра

Покажем два способа подключения файлового фильтра. Первый способ - файловый фильтр можно создать и подключить к объекту JFileChooser с использованием класса FileNameExtensionFilter, пример использования которого представлен в следующем коде.

Второй способ - используем вспомогательный внутренний класс FileFilterExt, наследующий свойства класса FileFilter, в котором определяем два поля (расширение файлов extension, описание description) и переопределяем методы accept и getDescription.

В следующем коде слушателя выбора файла для кнопки btnFileFilter определяется заголовок окна, в цикле создаются экземпляры фильтров FileFilterExt, которые подключаются к fileChooser, и определяется режим открытия (JFileChooser.FILES_ONLY).

Интерфейс окна JFileChooser в режиме выбора файла с использованием файлового фильтра представлен на следующем скриншоте.


Исходные коды примеров, рассмотренных на странице, можно скачать здесь (2.20 Кб).

JFileChooser имеет 6 конструкторов:

  • JFileChooser() – пустой конструктор, указывающий на каталог пользователя по умолчанию
  • JFileChooser(строка) – использует заданный путь
  • JFileChooser(Файл) – использует данный файл в качестве пути
  • JFileChooser(представление файловой системы) – использует заданное представление файловой системы
  • JFileChooser (Строка, представление файловой системы) – использует указанный путь и Представление файловой системы
  • JFileChooser (Файл, представление файловой системы) – использует данный текущий каталог и Представление файловой системы

Все различные способы вызова конструктора JFileChooser

Личное предпочтение автора состоит в том, чтобы учитывать Представление файловой системы . В приведенных ниже примерах мы используем FileSystemView.getfilesystemview() и указываем на домашний каталог через getHomeDirectory() . Этот процесс приводит к типу файла. Другими словами, мы используем конструктор JFileChooser(файл) принимая во внимание Представление файловой системы .

1. показать*Диалоговое окно() – Открыть или сохранить файл

Пример использования JFileChooser для получения абсолютного пути к файлу, который пользователь хочет открыть, или для получения местоположения, в котором пользователь хочет сохранить файл:

Обратите внимание, что два метода showOpenDialog() и showSaveDialog() похожи, разница в том, как разработчик обрабатывает каждый из них. По соображениям удобочитаемости я бы не предложил смешивать эти два метода.

2. Режим setFileSelectionMode(int) – Выберите файлы или каталоги

С помощью этого метода мы можем ограничить пользователя выбором только одного из каталогов ( JFileChooser.ТОЛЬКО ДИРЕКТОРИИ_ ) или только файлы ( JFileChooser.ТОЛЬКО ФАЙЛЫ ) или Файлы и каталоги ( JFileChooser. ФАЙЛЫ И КАТАЛОГИ ). Значение по умолчанию равно FILES_ONLY . Вот пример, который реализует JFileChooser. ТОЛЬКО ДИРЕКТОРИИ_ :

3. setMultiSelectionEnabled(логическое значение) – Разрешить множественный выбор

Пример, в котором включен множественный выбор. Пользователь выбирает несколько файлов, и программа печатает имена:

4. Фильтры – Ограничивают набор файлов, показываемых пользователю

Всегда удобно ограничить выбор пользователя потребностями программы. Если, например, вашей программе требуются изображения в формате png и gif, было бы хорошей практикой ограничить выбор пользователя только этим. В приведенном ниже примере показано, как этого добиться с помощью пользовательского фильтра FileNameExtensionFilter :

Как вы можете видеть, пользователю не разрешается выбирать что-либо еще. Каталог, показанный выше, содержит и другие типы изображений, но пользователю отображаются только gif и png.

Каталог выглядит следующим образом:

5. Использование ShowDialog()

Если вам нужно настроить кнопку утвердить, используйте метод ShowDialog() . Вот пример того, как его использовать:

Вы также должны проверить самые простые и наиболее часто используемые методы записи и чтения файлов:

JFileChooser Это быстрый и простой способ подсказать пользователям выбирать файлы или файлы. Вот несколько простых примеров этого класса.

JFileChooser Есть 6 конструктор:

  • JFileChooser() - указывая на пустую ручную функцию каталога по умолчанию пользователя
  • JFileChooser(String) - Используйте данный путь
  • JFileChooser(File) - Используйте данный файл как путь
  • JFileChooser(FileSystemView) - Используйте данный файловыйystemView
  • JFileChooser(String, FileSystemView) - используйте данный путь и FileSystemView
  • JFileChooser(File, FileSystemView) - используйте данный текущий каталог и FileSystemView

перевод JFileChooser Все разные методы конструктора

Персональные предпочтения автора считается FileSystemView 。 В приведенном ниже примере мы используем FileSystemView.getFileSystemView() И пропустите его getHomeDirectory() Укажите в основной каталог. Этот процесс вызывает тип файла. Другими словами, мы рассматриваем FileSystemView Конструктор одновременно использует JFileChooser(File) 。

1. show * Dialog()– Открыть или сохранить файлы

как использовать JFileChooser Чтобы получить пример абсолютного пути файла, который вы хотите открыть или получить местоположение, где пользователь хочет сохранить файл:

Внимание, два метода showOpenDialog() с участием showSaveDialog() Точно так же разница в том, как разработчики обрабатывают каждый метод. Для чтения, я не рекомендую смешивать два метода.

swing-jfilechooser-4a

Когда пользователь навигается к каталогу, выберите файл и нажмите «Open»

swing-jfilechooser-4b

2. setFileSelectionMode(int)– Выберите файл или каталог

Используя этот метод, мы можем ограничить каталог выбора пользователя (только JFileChooser.DIRECTORIES_ONLY ) Или только файлы ( JFileChooser.FILES_ONLY ) Или файлы и каталоги ( JFileChooser.FILES_AND_DIRECTORIES )。 По умолчанию FILES_ONLY 。 Это реально JFileChooser.DIRECTORIES_ONLY Пример:

swing-jfilechooser-4c

3. setMultiSelectionEnabled(Boolean)– Разрешить несколько вариантов

Включить несколько вариантов. Пользователь выбирает несколько файлов, программа будет распечатать имя:

swing-jfilechooser-4d

4. Фильтр -Ограничьте набор файлов, отображаемый пользователю

Всегда удобно ограничивать выбор пользователя на нужды программы. Например, если ваша программа требует изображения PNG и GIF, лучше всего ограничить выбор пользователя к этому. В следующем примере показано, как использовать настройки FileNameExtensionFilter Для достижения этой цели:

swing-jfilechooser-4e

Если вы видите, пользователи не позволяют пользователям выбрать что-нибудь еще. Приведенный выше каталог также содержит другие типы изображений, но для пользователя отображаются только GIF и PNG.

Каталог выглядит следующим образом:

swing-jfilechooser-4f

5. Используйте ShowDialog ()

Используйте, если вам нужен настраиваемая кнопка утверждения showDialog() метод. Ниже приведен пример использования методов:

swing-jfilechooser-4g

Примечание
JFileChooser Есть имя setApproveButtonText(String) 。 Проблема с этим методом заключается в том, что она применяется только к showOpenDialog() 。 Рекомендуется, когда вам нужно настроить кнопку showDialog() вместо showSaveDialog() 。

Вы также должны проверить самый простой, наиболее распространенный способ прочитать и записи файлов:

Читайте также: