Управление поиском файлов. Создание приложения на Java.
19 августа, 2007
Создание графического интерфейса
Последним этапом создания нашей программы является создание графического интерфейса. Подробно я его описывать не буду. Он разрабатывался только для того, чтобы продемонстрировать возможности нашей библиотеки, т.е. максимально упрощенным. Кроме того, подробное описание даже этого относительно простого интерфейса потребует отдельной статьи (если не больше). Поэтому, здесь я приведу только исходный код с комментариями. А если вы захотите подробно изучить библиотеку SWING, то подробную информацию можно найти в Java Tutorial (есть даже несколько книг, посвященных разработке графического интерфейса на Java).
Code (java)
-
/*
-
* Main.java
-
*
-
* Created on 16 Октябрь 2006 г., 20:02
-
*/
-
-
package filesearchswing;
-
-
import java.awt.event.WindowEvent;
-
import java.awt.event.WindowListener;
-
import javax.swing.*;
-
-
/**
-
*
-
* @author Стаценко Владимир
-
* http://www.vova-prog.narod.ru
-
*/
-
-
static MainPanel contentPane = null;
-
-
/** Создает новые экземпляры Main */
-
public Main() {
-
frame.addWindowListener(this);
-
}
-
-
private static void createAndShowGUI() {
-
//устанавливаем внешний вид интерфейса
-
try {
-
}
-
-
//создаем главный фрейм
-
//программа должна завершать работу при закрытии окна
-
Main m = new Main();
-
-
//Создаем панель, и делаем её главной панелью окна
-
contentPane = new MainPanel(frame);
-
contentPane.setOpaque(true);
-
frame.setContentPane(contentPane);
-
-
//упаковываем фрейм и делаем его видимым
-
frame.pack();
-
frame.setVisible(true);
-
}
-
-
/**
-
* Точка входа
-
* @param args аргументы командной строки
-
*/
-
//создаём интерфейс и отдельный поток для работы с ним
-
public void run() {
-
createAndShowGUI();
-
}
-
});
-
}
-
-
}
-
-
contentPane.stopSearch();
-
frame.dispose();
-
}
-
-
}
-
-
}
-
-
}
-
-
}
-
-
}
-
}
Класс MainPanel
Code (java)
-
/*
-
* MainPanel.java
-
*
-
* Created on 17 Октябрь 2006 г., 16:20
-
*
-
* To change this template, choose Tools | Template Manager
-
* and open the template in the editor.
-
*/
-
-
package filesearchswing;
-
-
import java.awt.GridLayout;
-
import java.awt.event.ActionEvent;
-
import java.awt.event.ActionListener;
-
import java.io.File;
-
import java.util.List;
-
import javax.swing.*;
-
import searchtools.*;
-
-
/**
-
* Этот класс предеставляет собой основную панель программы,
-
* на которой будут размещены элементы интерфейса.
-
*
-
* @author Стаценко Владимир
-
* http://www.vova-prog.narod.ru
-
*/
-
-
//создаем указатели на элементы интерфейса
-
-
//создаем строковые константы (текст в JLabel)
-
"Размер найденных файлов (байт): ";
-
-
//начальная папка поиска
-
//наш поисковик
-
private FileFinder finder = null;
-
//поток, в котором будет выполняться поиск
-
//указатель на главный фрейм программы (нужен для создания
-
//диалогового окна)
-
-
/**
-
* Создает новые экземпляры MainPanel
-
* @param frame указатель на главный фрейм программы
-
*/
-
//все компоненты на панели будут распологаться один
-
//под другим
-
-
this.frame = frame;
-
-
//создаем компоненты
-
//текстовое поле (для указания начальной папки)
-
//надпись и текстовое поле для ввода регулярного выражения
-
//JLabel, в которых будет отображаться состояние поиска
-
//кнопка "Обзор…"
-
//кнопка "Поиск"
-
-
//настраиваем обработчик событий нажатий на кнопки
-
selectFolder.addActionListener(this);
-
selectFolder.setActionCommand("browse");
-
startSearch.addActionListener(this);
-
startSearch.setActionCommand("search");
-
-
//добавляем компоненты на панель
-
add(folderName);
-
add(selectFolder);
-
add(patternLabel);
-
add(patternField);
-
add(filesNumberLabel);
-
add(foldersNumberLabel);
-
add(filesSizeLabel);
-
add(startSearch);
-
-
//создаем диалоговое окно для выбора начальной папки
-
-
//создаем поисковик
-
finder = new FileFinder();
-
//регистрируем класс, который будет получать уведомления
-
//о процессе поиска
-
finder.addListener(this);
-
}
-
-
/**
-
* Этот метод вызывается экземпляром класса FileFinder
-
* в начале поиска
-
*/
-
public void onSearchStart() {
-
//обновляем интерфейс программы
-
public void run() {
-
filesNumberLabel.setText(FILES_NUMBER_LABEL + "0");
-
foldersNumberLabel.setText(FOLDERS_NUMBER_LABEL + "0");
-
filesSizeLabel.setText(FILES_SIZE_LABEL + "0");
-
}
-
});
-
}
-
-
/**
-
* Этот метод вызывается экземпляром класса FileFinder
-
* периодически в процессе поиска
-
* @param totalLength общий размер найденных файлов
-
* @param filesNumber количество найденных файлов
-
* @param directoriesNumber количество найденных папок
-
*/
-
public void onSearchProgressChange(long totalLength,
-
long filesNumber, long directoriesNumber) {
-
//Т.к. обновление интерфейса программы выполняется в
-
//отдельном потоке, мы не можем напрямую использовать
-
//параметры метода. Для того, чтобы обойти это ограничение
-
//создаем константы, и присваиваем им значения параметров.
-
final long fn = filesNumber;
-
final long dn = directoriesNumber;
-
final long fl = totalLength;
-
//обновляем интерфейс
-
public void run() {
-
filesNumberLabel.setText(FILES_NUMBER_LABEL + fn);
-
foldersNumberLabel.setText(FOLDERS_NUMBER_LABEL + dn);
-
filesSizeLabel.setText(FILES_SIZE_LABEL + fl);
-
}
-
});
-
}
-
-
/**
-
* Этот метод вызывается экземпляром класса FileFinder
-
* один раз при завершении поиска
-
*/
-
public void onSearchEnd() {
-
//Т.к. обновление интерфейса программы выполняется в
-
//отдельном потоке, мы не можем напрямую использовать
-
//параметры метода. Для того, чтобы обойти это ограничение
-
//создаем константы, и присваиваем им значения параметров.
-
final long fn = finder.getFilesNumber();
-
final long dn = finder.getDirectoriesNumber();
-
final long fl = finder.getDirectorySize();
-
//обновляем интерфейс
-
public void run() {
-
filesNumberLabel.setText(FILES_NUMBER_LABEL + fn);
-
foldersNumberLabel.setText(FOLDERS_NUMBER_LABEL + dn);
-
filesSizeLabel.setText(FILES_SIZE_LABEL + fl);
-
//устанавливаем команду кнопки "Поиск" (в процессе
-
//поиска устоновлено "Стоп")
-
startSearch.setText("Поиск");
-
startSearch.setActionCommand("search");
-
}
-
});
-
}
-
-
/**
-
* Этот метод вызывается при нажатии на кнопки программы
-
* @param e объект с информацией о возникшем событии (например,
-
* о том, какая кнопка была нажата)
-
*/
-
//обработка нажатия кнопки "Обзор…"
-
if(e.getActionCommand().equals("browse")) {
-
//открываем диалог выбора папки
-
int retVal = fc.showOpenDialog(this);
-
//если папка выбрана…
-
//…устанавливаем её в качестве стартовой папки
-
startFolder = fc.getSelectedFile();
-
//и отображаем полный путь в текстовом поле
-
folderName.setText(startFolder.getAbsolutePath());
-
}
-
}
-
//обработка нажатия кнопки "Поиск"
-
if(e.getActionCommand().equals("search")) {
-
//создаем и запускаем новый поток, в котором будет
-
//выполняться поиск
-
searchThread.start();
-
//устанавливаем для кнопки команду "Стоп"
-
startSearch.setText("Остановить");
-
startSearch.setActionCommand("stop");
-
}
-
//обработка нажатия кнопки "Стоп"
-
if(e.getActionCommand().equals("stop")) {
-
stopSearch();
-
//устанавливаем для кнопки команду "Поиск"
-
startSearch.setText("Поиск");
-
startSearch.setActionCommand("search");
-
}
-
}
-
-
public void stopSearch() {
-
//останавливаем поиск
-
finder.stopSearch();
-
//ждем завершения потока, в котором выполняется поиск
-
if(searchThread != null) {
-
while(searchThread.isAlive()) {
-
}
-
}
-
}
-
-
/**
-
* Этот метод выполняется в отдельном потоке
-
* (в нем и выполняется поиск)
-
*/
-
public void run() {
-
try {
-
//читаем регулярное выражение
-
//начинаем поиск
-
//после завершения поиска создаем диалоговое окно со
-
//списком найденных объектов
-
public void run() {
-
ResultsDialog rd = new ResultsDialog(frame, res);
-
rd.pack();
-
rd.setVisible(
