Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АрхитектураБиологияГеографияДругоеИностранные языки
ИнформатикаИсторияКультураЛитератураМатематика
МедицинаМеханикаОбразованиеОхрана трудаПедагогика
ПолитикаПравоПрограммированиеПсихологияРелигия
СоциологияСпортСтроительствоФизикаФилософия
ФинансыХимияЭкологияЭкономикаЭлектроника

Класс JFileChooser

Интерфейс Serializable | Классы ObjectOutputStream и ObjectInputStream | Промежуточные данные | Практическая работа | События и их реализация в JFC | Событийная модель в JFC | Слушатели событий | Класс JList библиотеки Swing | Внешний вид отображаемого списка | Практическая работа |


Читайте также:
  1. A.1. Классификация интерфейсов
  2. Adding initializers to a class Добавление инициализаторами к классу
  3. CASE-средства. Общая характеристика и классификация
  4. Defining and instantiating classes Определение и создание экземпляра классы
  5. I класс
  6. II. Классификация видов нарушений при привлечении кредитов и займов
  7. II. Классификация по функциональному назначению

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

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

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

Рисунок 1.

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

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

Конструкторы класса:

public JFileChooser()

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

public JFileChooser(String currentDirectoryPath)

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

public JFileChooser(File currentDirectory)

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

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

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

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

// Dlg5.java

// Редактирование текстового файла (незаконченный пример)

 

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

import java.io.*;

 

public class Dlg5 extends JFrame {

 

JTextArea txt;

File curentFile = null;

 

Dlg5() {

super("Редактирование текстового файла");

 

try {

UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());

}

catch(Exception e) {

}

 

setSize(520, 400);

Container c = getContentPane();

JPanel pn = new JPanel(new FlowLayout(FlowLayout.CENTER, 8, 5));

JButton btn1 = new JButton("Открыть");

pn.add(btn1);

btn1.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {

open();

}

});

JButton btn2 = new JButton("Записать");

pn.add(btn2);

btn2.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {

save();

}

});

 

c.add(pn, BorderLayout.NORTH);

txt = new JTextArea();

JScrollPane pane = new JScrollPane(txt);

c.add(pane, BorderLayout.CENTER);

 

WindowListener wndCloser = new WindowAdapter() {

public void windowClosing(WindowEvent e) {

System.exit(0);

}

};

addWindowListener(wndCloser);

 

setVisible(true);

}

 

public void open() {

JFileChooser fc = new JFileChooser();

ExtFileFilter ff1 = new ExtFileFilter("txt", "*.txt — текстовые

файлы");

fc.addChoosableFileFilter(ff1);

ExtFileFilter ff2 = new ExtFileFilter("java", "*.java — программы на

JAVA");

fc.addChoosableFileFilter(ff2);

if(fc.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) {

File f = fc.getSelectedFile();

//--- проверить, что это файл и он доступен для чтени

if (!f.isFile() ||!f.canRead()) {

System.out.println("Файл "+f.getName()+" является каталогом

или не"+

" доступен для чтения");

return;

}

curentFile = f;

BufferedReader in = null;

try {

in = new BufferedReader(new FileReader(curentFile));

for(;;) {

String str = in.readLine();

if (str == null)

break;

txt.append(str+"\n");

}

} catch (IOException ex) {

ex.printStackTrace();

} finally {

if (in!= null)

try {

in.close();

} catch (IOException e) {

}

}

}

}

 

public void save() {

}

 

public static void main(String[] args) {

Dlg5 d = new Dlg5();

}

}

 

class ExtFileFilter extends javax.swing.filechooser.FileFilter {

 

String ext;

String description;

 

ExtFileFilter(String ext, String descr) {

this.ext = ext;

description = descr;

}

 

public boolean accept(File f) {

if(f!= null) {

if(f.isDirectory()) {

return true;

}

String extension = getExtension(f);

if(extension == null)

return (ext.length() == 0);

return ext.equals(extension);

}

return false;

}

 

public String getExtension(File f) {

if(f!= null) {

String filename = f.getName();

int i = filename.lastIndexOf('.');

if(i>0 && i<filename.length()-1) {

return filename.substring(i+1).toLowerCase();

};

}

return null;

}

 

public String getDescription() {

return description;

}

 

}

 

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

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

public int showOpenDialog(Component parent)

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

public int showSaveDialog(Component parent)

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

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

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

public void open() {

JFileChooser fc = new JFileChooser();

ExtFileFilter ff1 = new ExtFileFilter("txt", "*.txt — текстовые

файлы");

fc.addChoosableFileFilter(ff1);

ExtFileFilter ff2 = new ExtFileFilter("java", "*.java — программы на

JAVA");

fc.addChoosableFileFilter(ff2);

if(fc.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) {

File f = fc.getSelectedFile();

...

}

}

 

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

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

Пользователь мог:

- отказаться: JFileChooser.CANCEL_OPTION

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

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

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

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

public void setFileSelectionMode(int mode);

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

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

fc.setFileSelectionMode(JFileChooser.FILES_ONLY);

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

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

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

public void addChoosableFileFilter(FileFilter filter)

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

public boolean removeChoosableFileFilter(FileFilter f)

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

public void resetChoosableFileFilters()

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

public void setAcceptAllFileFilterUsed(boolean b)

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

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

chooser.setAcceptAllFileFilterUsed(false);

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

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

public abstract boolean accept(File f)

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

public abstract String getDescription()

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

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

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


Дата добавления: 2015-08-18; просмотров: 251 | Нарушение авторских прав


<== предыдущая страница | следующая страница ==>
Интерфейс FileFilter| Сериализация объектов

mybiblioteka.su - 2015-2024 год. (0.019 сек.)