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

Обновлено: 07.07.2024

A JavaFX FileChooser class ( javafx.stage.FileChooser ) is a dialog that enables the user to select one or more files via a file explorer from the user's local computer. The JavaFX FileChooser is implemented in the class javafx.stage.FileChooser . In this JavaFX FileChooser tutorial I will show you how to use the JavaFX FileChooser dialog.

Here is an example screenshot of how a JavaFX FileChooser looks:

Creating a FileChooser

In order to use the JavaFX FileChooser dialog you must first create a FileChooser instance. Here is an example of creating a JavaFX FileChooser dialog:

As you can see, it is pretty easy to create a FileChooser instance.

Showing the FileChooser Dialog

Showing the JavaFX FileChooser dialog is done by calling its showOpenDialog() method. Here is an example of showing a FileChooser dialog:

The File returned by the showOpenDialog() method is the file the user selected in the FileChooser .

The stage parameter is the JavaFX Stage that should "own" the FileChooser dialog. By "owning" is meant what Stage from which the FileChooser dialog is shown. This will typically be the Stage in which the button sits that initiates the showing of the FileChooser .

Showing a FileChooser is typically done as a result of a click on a button or menu item. Here is a full JavaFX example that shows a button that opens a FileChooser when it is clicked:

This example creates a full JavaFX application with a Button that when clicked opens a FileChooser . Notice how the primary Stage for the JavaFX application is passed as parameter to the FileChooser showOpenDialog() method.

Setting Initial Directory

You can set the initial directory displayed in the JavaFX FileChooser via its setInitialDirectory() method. Here is an example of setting the initial directory of a FileChooser dialog:

This example sets the initial directory displayed by the FileChooser to data .

Setting Initial File Name

You can set the initial file name to display in the FileChooser . Some platforms (e.g. Windows) may ignore this setting, though. Here is an example of setting the initial file name of a FileChooser :

This example sets the initial file name to myfile.txt .

Adding File Name Filters

It is possible to add file name filters to a JavaFX FileChooser . File name filters are used to filter out what files are shown in the FileChooser when the user browses around the file system. Here is an example of adding file name filters:

This examples adds two file name filters to the FileChooser . The user can choose between these file name filters inside the FileChooser dialog.


В JavaFX FileChooser - это класс, который используется для просмотра файлов из системы. Несколько операций включают открытие одного файла, открытие нескольких файлов и сохранение файлов в системе. Выбор файла JavaFX создается из класса javafx.stage.FileChooser. Синтаксис, состояния, конструкторы и пример JavaFX FileChooser будут обсуждаться в следующих разделах.

Синтаксис:

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

FileChooser fl = new FileChooser();

Убедитесь, что класс javafx.stage.FileChooser импортирован, прежде чем писать программу JavaFX.

JavaFX FileChooser Constructors

Существует только один конструктор для JavaFX FileChooser. То есть,

FileChooser (): диалог FileChooser будет создан

// create a FileChooser
FileChooser fl = new FileChooser();

Методы JavaFX FileChooser

Ниже приведены некоторые из наиболее часто используемых методов в JavaFX FileChooser:

  • getTitle (): заголовок выбора файла будет возвращен.
  • setTitle (String s): будет выбран заголовок выбора файла.
  • getInitialDirectory (): Будет возвращен начальный каталог выбора файлов.
  • setInitialDirector (файл f): будет установлен начальный каталог выбора файлов .
  • setInitialFileName (String s): будет установлено первоначальное имя файла средства выбора файла.
  • getInitialFileName (): будет возвращено исходное имя файла выбора файла.
  • showOpenDialog (Window wn): появляется диалоговое окно с выбором нового открытого файла.
  • showSaveDialog (Window wn): появляется диалоговое окно с новым выбором файла сохранения.

Как создать FileChooser?

Есть несколько шагов для создания FileChooser.

Шаг 1: Создайте FileChooser. Чтобы создать FileChooser, можно использовать следующий синтаксис:

FileChooser fc = new FileChooser();

Шаг 2: Создайте вертикальную рамку. На этом шаге создайте вертикальное поле следующим образом.

VBox vb = new VBox();

Шаг 3: Добавьте FileChooser, созданный в Scene Graph. После создания вертикальной рамки добавьте FileChooser к графу сцены, используя следующие шаги.

//create a scene
Scene sce = new Scene(vb, 300, 200);
//set the scene
s.setScene(sce);
//displays the result
s.show();

Программа для реализации JavaFX FileChooser

Теперь давайте взглянем на реализацию средства выбора файлов JavaFX:

Пример № 1

Java-программа для демонстрации FileChooser, который просматривает местоположение файла.

Код:

//Java program to demonstrate file chooser that browse the file location
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.HBox;
import javafx.stage.FileChooser;
import javafx.stage.Stage;
//sample class that extends Application classs
public class JavaFXfilechooserexample extends Application(
//application starts at this point
@Override
public void start(Stage s) throws Exception (
//create a file chooser
FileChooser f = new FileChooser();
//set the title
f.setTitle("Opening the location..");
//open the dialog box
f.showOpenDialog(s);
HBox r = new HBox();
r.setSpacing(20);
//create scene
Scene sc = new Scene(r, 350, 100);
//set the scene
s.setScene(sc);
//set title
s.setTitle("Sample file chooser");
//display the result
s.show();
)
//main method
public static void main(String() args) (
launch(args);
)
)

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


Пример № 2

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

Код:

Выход:

При выполнении кода появится диалоговое окно, показанное ниже.


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


Выберите файл в соответствии с вашими требованиями. Для демонстрации я выбрал файл, как показано ниже.


После выбора произойдет изменение метки диалогового окна.


Хорошо видно, что метка меняется с именем файла, которое я выбрал.

При нажатии диалогового окна «Показать сохранение» необходимо выбрать место для сохранения выбранного файла.


Тогда кнопка сохранения может быть нажата.

Вывод

В JavaFX средства выбора файлов используются для просмотра и сохранения отдельных файлов и нескольких файлов. В отличие от других, он использует только не параметризованный конструктор. В этом документе четко обсуждаются синтаксис, конструктор, методы и программа для реализации JavaFX File Chooser.

Рекомендуемые статьи

Это руководство по JavaFX FileChooser. Здесь мы обсуждаем синтаксис, конструкторы, методы и примеры для реализации с соответствующими кодами и выходными данными. Вы также можете просмотреть другие наши статьи, чтобы узнать больше -

Screenshot AddressApp Part 5

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

Сохранение пользовательских настроек

Благодаря классу Preferences , Java позволяет сохранять некоторую информацию о состоянии приложения. В зависимости от операционной системы, Preferences сохраняются в различных местах (например, в файле реестра Windows).

Мы не можем использовать класс Preferences для сохранения всей адресной книги. Но он позволяет сохранять некоторые простые настройки приложения, например, путь к последнему открытому файлу. Имея эти данные, после перезапуска приложения мы всегда сможем восстанавливать состояние нашего приложения.

Следующие два метода обеспечивают сохранение и восстановление настроек нашего приложения. Добавьте их в конец класса MainApp :

MainApp.java

Хранение данных в XML

Почему именно XML?

Один из наиболее распространённых способов хранения данных, это использование баз данных. В то время, как данные, которые мы должны хранить, являются объектами, базы данных содержат их в виде реляционных данных (например, таблиц). Это называется объектно-реляционное рассогласование импендансов. Для того, чтобы привести наши объектные данные в соответствие с реляционными таблицами, требуется выполнить дополнительную работу. Существуют фреймворки, которые помогают приводить объектные данные в соответствие с реляционной базой данных (Hibernate - один из наиболее популярных), но чтобы начать их использовать, также необходимо проделать дополнительную работу и настройку.

Для нашей простой модели данных намного легче хранить данные в виде XML. Для этого мы будем использовать библиотеку JAXB (Java Architechture for XML Binding). Написав всего несколько строк кода, JAXB позволит нам сгенерировать примерно такой XML-файл:

Пример сгенерированного XML-файла

Использование JAXB

Библиотека JAXB уже включена в JDK. Это значит, что никаких дополнительных библиотек подключать не придётся.

JAXB предоставляет две основные функции: способность к маршаллированию объектов Java в XML и обратную демаршализацию из xml-файла в объекты Java.

Для того, чтобы с помощью JAXB можно было выполнять подобные преобразования, нам необходимо подготовить нашу модель.

Подготовка класса-модели для JAXB

Данные, которые мы хотим сохранять, находятся в переменной personData класса MainApp . JAXB требует, чтобы внешний класс наших данных был отмечен аннотацией @XmlRootElement (только класс, поле этой аннотацией пометить нельзя). Типом переменной personData является ObservableList , а его мы не можем аннотировать. Для того, чтобы разрешить эту ситуацию, необходимо создать класс-обёртку, который будет использоваться исключительно для хранения списка адресатов, и который мы сможем аннотировать как @XmlRootElement .

Создайте в пакете ch.makery.address.model новый класс PersonListWrapper .

PersonListWrapper.java

Обратите внимание на две аннотации:

  • @XmlRootElement определяет имя корневого элемента.
  • @XmlElement это необязательное имя, которое мы можем задать для элемента.

Чтение и запись данных с помощью JAXB

Сделаем наш класс MainApp ответственным за чтение и запись данных нашего приложения. Для этого добавьте в конец класса MainApp.java два метода:

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

Обработка действий меню

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

В приложении Scene Builder откройте файл RootLayout.fxml и перенесите необходимое количество пунктов меню (MenuItem) из вкладки Library на вкладку Hierarchy. Создайте следующие пункты меню: New, Open…, Save, Save as… и Exit.

Add Menu Items

Подсказка: для установки на пункты меню горячих клавиш спользуйте свойство Accelerator во вкладке Properties.

Класс RootLayoutController

Для обработки поведения меню нам необходим ещё один класс-контроллер. В пакете ch.makery.address.view создайте класс RootLayoutController .

Добавьте новому классу-контроллеру следующее содержание:

RootLayoutController.java

Компонент FileChooser

Обратите внимание на методы в классе RootLayoutController , которые используют компонент FileChooser . Сперва мы создаём новый экземпляр класса FileChooser . Потом применяем фильтр расширения - при выборе файлов будут показываться только те, которые имеют расширение .xml . Ну и наконец, мы отображаем данный компонент выше PrimaryStage.

Если пользователь закрывает диалог выбора файлов ничего не выбрав, то возвращается null . В противном случае мы берём выбранный файл и передаём его в методы loadPersonDataFromFile(. ) или savePersonDataToFile(. ) , которые находятся в классе MainApp.

Связывание fxml-представления с классом-контроллером

В приложении Scene Builder откройте файл RootLayout.fxml . Во вкладке Controller в качестве класса-контроллера выберите значение RootLayoutController .

Menu Actions

Перейдите на вкладку Hierarchy и выберите пункт меню. Во вкладке Code в качестве значений свойства On Action вы можете увидеть все доступные методы выбранного класса-контроллера. Выберите метод, соответствующий данному пункту меню.

Повторите предыдущий шаг для каждого пункта меню.

Закройте приложение Scene Builder и обновите проект (нажмите Refresh (F5) на корневой папке вашего проекта). Это позволит среде разработки Eclipse “увидеть” изменения, сделанные в приложении Scene Builder.

Связывание главного класса с классом RootLayoutController

В некоторых местах кода классу RootLayoutController требуется ссылка на класс MainApp . Эту ссылку мы ещё пока не передали.

Откройте класс MainApp и замените метод initRootLayout() следующим кодом:

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

Тестирование

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

Когда вы откроете xml -файл в текстовом редакторе, то вместо значения дня рождения увидите пустой тег <birthday/> . Дело в том, что JAXB не знает как преобразовать тип LocalDate в XML. Чтобы определить процесс преобразования, мы должны предоставить собственный класс LocalDateAdapter .

Внутри пакета ch.makery.address.util создайте новый класс LocalDateAdapter и скопируйте туда следующий код:

LocalDateAdapter.java

Потом откройте класс Person.java и аннотируйте метод getBirthday() :

Теперь запустите приложение ещё раз. Попытайтесь сохранить и загрузить xml-файл с данными. Приложение должно автоматически загружать последний открытый файл после перезапуска.

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 Кб).

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