Диалоговое окно JFileChooser

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

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

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

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

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

// Создание JFileChooser с указанием директории пользователя по умолчанию
JFileChooser() 

// Создание JFileChooser с указанием currentDirectory директории
JFileChooser(File currentDirectory) 
 
// Создание JFileChooser с указанием currentDirectory директории и
// файловой системы
JFileChooser(File currentDirectory, FileSystemView fsv) 
 
// Создание JFileChooser с определенной файловой системы
JFileChooser(FileSystemView fsv) 
 
// Создание JFileChooser с указанием currentDirectoryPath пути
JFileChooser(String currentDirectoryPath) 
 
// Создание JFileChooser с указанием currentDirectoryPath пути и
// файловой системы
JFileChooser(String currentDirectoryPath, FileSystemView fsv) 

Основные метод 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() для подключения к кнопкам слушателей.

// Пример использования диалоговых окон работы с файлами и директориями

import javax.swing.*;
import java.awt.event.*;

public class FileChooserTest extends JFrame
{
    private  JButton  btnSaveFile   = null;
    private  JButton  btnOpenDir    = null;
    private  JButton  btnFileFilter = null;

    private  JFileChooser fileChooser = null;

    private final String[][] FILTERS = {{"docx", "Файлы Word (*.docx)"},
                                        {"pdf" , "Adobe Reader(*.pdf)"}};
    public FileChooserTest() {
        super("Пример FileChooser");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        // Кнопка создания диалогового окна для выбора директории
        btnOpenDir = new JButton("Открыть директорию");
        // Кнопка создания диалогового окна для сохранения файла
        btnSaveFile = new JButton("Сохранить файл");
        // Кнопка создания диалогового окна для сохранения файла
        btnFileFilter = new JButton("Фильтрация файлов");

        // Создание экземпляра JFileChooser 
        fileChooser = new JFileChooser();
        // Подключение слушателей к кнопкам
        addFileChooserListeners();

        // Размещение кнопок в интерфейсе
        JPanel contents = new JPanel();
        contents.add(btnOpenDir   );
        contents.add(btnSaveFile  );
        contents.add(btnFileFilter);
        setContentPane(contents);
        // Вывод окна на экран
        setSize(360, 110);
        setVisible(true);
    }
    public static void main(String[] args)
    {
        // Локализация компонентов окна JFileChooser
        UIManager.put(
                 "FileChooser.saveButtonText", "Сохранить");
        UIManager.put(
                 "FileChooser.cancelButtonText", "Отмена");
        UIManager.put(
                 "FileChooser.fileNameLabelText", "Наименование файла");
        UIManager.put(
                 "FileChooser.filesOfTypeLabelText", "Типы файлов");
        UIManager.put(
                 "FileChooser.lookInLabelText", "Директория");
        UIManager.put(
                 "FileChooser.saveInLabelText", "Сохранить в директории");
        UIManager.put(
                 "FileChooser.folderNameLabelText", "Путь директории");

        new FileChooserTest();
    }
}

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

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

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

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

btnOpenDir.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        fileChooser.setDialogTitle("Выбор директории");
        // Определение режима - только каталог
        fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
        int result = fileChooser.showOpenDialog(FileChooserTest.this);
        // Если директория выбрана, покажем ее в сообщении
        if (result == JFileChooser.APPROVE_OPTION )
                  JOptionPane.showMessageDialog(FileChooserTest.this, 
                                                fileChooser.getSelectedFile());
    }
});

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

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

btnSaveFile.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        fileChooser.setDialogTitle("Сохранение файла");
        // Определение режима - только файл
        fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
        int result = fileChooser.showSaveDialog(FileChooserTest.this);
        // Если файл выбран, то представим его в сообщении
        if (result == JFileChooser.APPROVE_OPTION )
            JOptionPane.showMessageDialog(FileChooserTest.this, 
                              "Файл '" + fileChooser.getSelectedFile() + 
                              " ) сохранен");
    }
});

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

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

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

import javax.swing.filechooser.FileNameExtensionFilter;
...
FileNameExtensionFilter filter = new FileNameExtensionFilter(
                                         "Word & Excel", "docx", "xlsx");
fileChooser.setFileFilter(filter);

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

// Фильтр выбора файлов определенного типа
class FileFilterExt extends javax.swing.filechooser.FileFilter 
{
    String extension  ;  // расширение файла
    String description;  // описание типа файлов

    FileFilterExt(String extension, String descr)
    {
        this.extension = extension;
        this.description = descr;
    }
    @Override
    public boolean accept(java.io.File file)
    {
        if(file != null) {
            if (file.isDirectory())
                return true;
            if( extension == null )
                return (extension.length() == 0);
            return file.getName().endsWith(extension);
        }
        return false;
    }
    // Функция описания типов файлов
    @Override
    public String getDescription() {
        return description;
    }
}

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

btnFileFilter.addActionListener(new ActionListener()
{
    public void actionPerformed(ActionEvent e)
    {
        fileChooser.setDialogTitle("Выберите файл");
        // Определяем фильтры типов файлов
        for (int i = 0; i < FILTERS[0].length; i++) {
            FileFilterExt eff = new FileFilterExt(FILTERS[i][0], 
                                                  FILTERS[i][1]);
            fileChooser.addChoosableFileFilter(eff);
        }
        // Определение режима - только файл
        fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
        int result = fileChooser.showSaveDialog(FileChooserTest.this);
        // Если файл выбран, покажем его в сообщении
        if (result == JFileChooser.APPROVE_OPTION )
            JOptionPane.showMessageDialog(FileChooserTest.this,
                                  "Выбран файл ( " + 
                                   fileChooser.getSelectedFile() + " )");
        }
});

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

Скачать примеры

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

  Рейтинг@Mail.ru