- •Лабораторная работа 6 Использование строк в оконных приложениях Java
- •Работа со строками в Java. Основные методы класса String
- •Создание графического интерфейса пользователя с помощью библиотек awt и Swing
- •Основные классы библиотек awt и Swing
- •Класс Component
- •Класс Container
- •Класс окна - jFrame
- •JTable – отображение данные в виде таблицы
- •Универсальный слушатель ActionListener
JTable – отображение данные в виде таблицы
Очень часто возникает необходимость в приложениях показать данные в виде таблицы с определенным количеством строк и столбцов. В Java Swing для отображения табличных данных используется комопнент JTable. JTable внутри себя не содержит данные, а служит только для их отображения.
Рассмотрим простой пример создания и использования таблицы. Для этого мы создадим таблицу, заполним её тестовыми данными и разместим на панели прокрутки. Размещение таблицы на панели прокрутки – это обычная практика, потому что это удобно и красиво.
Существует несколько способов того, как сказать JTable, какие данные и столбцы следует отображать. Рассмотрим самый простой способ. Для начала определим, какие столбцы мы хотим показывать в таблице. Для примера взяты столбцы проводника Windows – Name (Имя файла или папки), Last modified (Дата последней модификации), Type (Тип) и Size (Размер). Собираем столбцы в массив строк вот так:
|
String[] columnNames = {"Name", "Last modified", "Type", "Size"}; |
Далее необходимо определить данные, которые мы хотим отображать в таблице. Делается это тоже при помощи массива строк вот так:
|
String[][] data = { {"addins", "02.11.2006 19:15", "Folder", ""}, {"AppPatch", "03.10.2006 14:10", "Folder", ""}, {"assembly", "02.11.2006 14:20", "Folder", ""}, {"Boot", "13.10.2007 10:46", "Folder", ""}, {"Branding", "13.10.2007 12:10", "Folder", ""}, {"Cursors", "23.09.2006 16:34", "Folder", ""}, {"Debug", "07.12.2006 17:45", "Folder", ""}, {"Fonts", "03.10.2006 14:08", "Folder", ""}, {"Help", "08.11.2006 18:23", "Folder", ""}, {"explorer.exe", "18.10.2006 14:13", "File", "2,93MB"}, {"helppane.exe", "22.08.2006 11:39", "File", "4,58MB"}, {"twunk.exe", "19.08.2007 10:37", "File", "1,08MB"}, {"nsreg.exe", "07.08.2007 11:14", "File", "2,10MB"}, {"avisp.exe", "17.12.2007 16:58", "File", "12,67MB"}}; |
Далее необходимо создать собственно сам JTable и передать ему массив столбцов и массив с данными для показа.
|
JTable table = new JTable(data, columnNames); |
Потом создаем JScrollPane, на котором размещаем таблицу и добавляем панель на JFrame. Внешний вид получившегося приложения можно увидеть на рисунке ниже.
Исходный код приложения представлен ниже.
import java.awt.Dimension;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
public class TestFrame extends JFrame {
public static void createGUI() {
JFrame frame = new JFrame("Test frame");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
String[] columnNames = {"Name","Last modified","Type", "Size" };
String[][] data = {
{"addins", "02.11.2006 19:15", "Folder", ""},
{"AppPatch", "03.10.2006 14:10", "Folder", ""},
{"assembly", "02.11.2006 14:20", "Folder", ""},
{"Boot", "13.10.2007 10:46", "Folder", ""},
{"Branding", "13.10.2007 12:10", "Folder", ""},
{"Cursors", "23.09.2006 16:34", "Folder", ""},
{"Debug", "07.12.2006 17:45", "Folder", ""},
{"Fonts", "03.10.2006 14:08", "Folder", ""},
{"Help", "08.11.2006 18:23", "Folder", ""},
{"explorer.exe", "18.10.2006 14:13", "File", "2,93MB"},
{"helppane.exe", "22.08.2006 11:39", "File", "4,58MB"},
{"twunk.exe", "19.08.2007 10:37", "File", "1,08MB"},
{"nsreg.exe", "07.08.2007 11:14", "File", "2,10MB"},
{"avisp.exe", "17.12.2007 16:58", "File", "12,67MB"},
};
JTable table = new JTable(data, columnNames);
JScrollPane scrollPane = new JScrollPane(table);
frame.getContentPane().add(scrollPane);
frame.setPreferredSize(new Dimension(450, 200));
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true); }
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
JFrame.setDefaultLookAndFeelDecorated(true);
createGUI(); } }); }}
Обработка событий в Swing
Графический интерфейс пользователя включает в себя не только расположение в окне необходимых элементов управления, но и назначение реакции на пользовательские события. Большая честь действий в оконных программах выполняется в ответ на выбор пользователем команд меню, нажатие кнопок, а иногда даже просто в ответ на ввод нового символа в текстовое поле.
Таким образом, при разработке программы необходимо:
Выявить события, в ответ на которые потребуется реакция программы.
Написать код, реализующий эту реакцию (так называемый обработчик событий).
Связать обработчик события с соответствующим событием.
Первый пункт зависит от логики работы приложения и находится всецело на усмотрении программиста. Обработчик события — это, как правило, обычный метод и ничего особенного в его написании нет.
Шаблон проектирования «наблюдатель» (listener)
В библиотеке Swing для привязки обработчика события к вызывающему его компоненту используется шаблон проектирования «наблюдатель».
Шаблоны проектирования — это стандартные приемы объектно-ориентированного программирования, позволяющие оптимальным образом справиться с нетривиальными, но часто возникающими в программировании ситуациями. Шаблон проектирования описывает классы, которые необходимо ввести для разрешения такой ситуации и взаимодействие между классами.
Шаблон проектирования «наблюдатель» применяется, когда один объект должен оповещать другие о произошедших с ним изменениях или внешних воздействиях. Такой объект называется наблюдаемым, а объекты, которые следует оповестить — наблюдателями.
Для того, чтобы подобное взаимодействие было возможным, объект-наблюдатель должен иметь метод (или несколько методов) с заранее определенными именем и параметрами. Когда с наблюдаемым объектом произойдет ожидаемое событие, он вызовет соответствующий метод у своего наблюдателя. В этом методе и будет запрограммирована реакция на событие.
Для того, чтобы наблюдаемый объект мог вызвать метод наблюдателя, он должен знать о том, что такой наблюдатель существует. Поэтому у наблюдаемого предварительно должен быть вызван специальный метод, регистрирующий его наблюдателя.
Заметим, что в данной схеме один наблюдатель может быть зарегистрирован у нескольких объектов (т.е. одинаково реагировать на изменения в каждом из них), а у одного объекта может быть несколько наблюдателей (т.е. при возникновении события выполняется несколько независимых методов-обработчиков). Это весьма увеличивает гибкость программирования.
Механизм обработки событий библиотеки Swing
В контексте графического интерфейса пользователя наблюдаемыми объектами являются элементы управления: кнопки, флажки, меню и т.д. Они могут сообщить своим наблюдателям об определенных событиях, как элементарных (наведение мышкой, нажатие клавиши на клавиатуре), так и о высокоуровневых (изменение текста в текстовом поле, выбор нового элемента в выпадающем списке и т.д.).
Наблюдателями должны являться объекты классов, поддерживающих специальные методы, о которых «знает» наблюдаемый и вызывает их при наступлении события. Такие классы в терминологии Swing называются слушателями.
