
- •Программирование на Java Тема 6.1 Программирование GUI с использованием Swing
- •Swing
- •Swing
- •Окна Swing
- •Окна Swing
- •Swing
- •Swing
- •Swing
- •Swing
- •Swing
- •Swing
- •Swing
- •Swing
- •Swing
- •Swing
- •Swing
- •Swing
- •Swing
- •Swing
- •Swing
- •Swing
- •Swing
- •Swing
- •Swing
- •Swing
- •Swing
- •Swing
- •Swing
- •Swing
- •Swing
- •Swing
- •Swing
- •Swing
- •Swing

Программирование на Java Тема 6.1 Программирование GUI с использованием Swing
1

AWT
Пакеты, содержащие наборы классов для создания
графического пользовательского интерфейса:
java.awt (AWT — Abstract Window Toolkit)
javax.swing
Исходная иерархия классов AWT
2

AWT
Исходное назначение AWT — предоставить набор графических компонентов, который вобрал бы в себя наиболее характерные черты современных элементов управления и позволил бы однократно создавать пользовательские интерфейсы, подходящие для любой платформы.
Компоненты AWT на самом деле не выполняли никакой работы и были очень простыми — это были просто «Java-оболочки» для элементов управления той операционной системы, на которой работала JVM и пользователь. Все запросы к этим компонентам незаметно перенаправлялись к операционной системе, которая и выполняла всю работу. Чтобы сделать классы AWT независимыми от конкретной платформы, каждому из них был сопоставлен своеобразный помощник1 (peer),ькоторый и работал с этой платформой. Для того чтобы встроить в AWT поддержку новой платформы, нужно было просто переписать код этих помощников, а интерфейс основных классов оставался неизменным.
На слайде показана исходная иерархия |
классов AWT. Диаграмма следует формату |
унифицированного языка моделирования |
(Unified Modeling Language, UML): сверху |
располагаются базовые классы, а ниже классы, |
унаследованные от базовых. |
Базовые свойства и поведение всех графических компонентов были описаны в абстрактном классе Component, который таким образом стал ядром библиотеки AWT. Почти все компоненты пользовательского интерфейса (за исключением меню) были унаследованы от этого класса (вы можете видеть это на диаграмме наследования). Важным частным случаем компонента в AWT являлся так называемый контейнер, отличительные черты которого были описаны в классе Container (также абстрактном). Контейнер отличался от обычных компонентов тем, что мог содержать в себе другие компоненты (а значит, и другие контейнеры, что позволяло организовывать пользовательские интерфейсы любой сложности).
3

Swing
Компоненты Swing — это легковесные компоненты AWT
Диаграмма наследования компонентов библиотеки Swing
4

Swing
Java — полноценный и весьма мощный язык программирования, и для создания чего-либо на нем вовсе не обязательно обращаться к ресурсам операционной системы. Эта простая мысль стала отправной точкой в процессе разработки легковесных компонентов.
Легковесный компонент — это просто область в пространстве экрана, занимаемом вашим Java- приложением. Главные его атрибуты — это координаты в окне и размер. Для операционной системы легковесный компонент вообще не существует, потому что представляет собой всего лишь часть какого-то окна. Всю работу по поддержке легковесных компонентов взяли на себя библиотека AWT и виртуальная машина Java. Для программиста не существует никакого отличия
между легковесными и обычными компонентами, которые по аналогии стали называть тяжеловесными , то есть имеющими связь с операционной системой и представленными в своем собственном окне.
Создать легковесный компонент в AWT можно двумя способами: унаследовать класс своего компонента от абстрактного класса Component (и получить обычный легковесный компонент) или унаследовать свой компонент от уже существующего наследника класса Component, другого абстрактного класса Container (и получить контейнер, тоже легковесный). По диаграмме наследования, представленной на слайде, видно, какой путь избрали создатели Swing.
Базовый класс библиотеки Swing стал называться JComponent и был унаследован от абстрактного класса Container, определяющего поведение контейнеров AWT.
Создатели Swing постарались максимально облегчить переход от AWT к новой библиотеке, практически полностью сохранив в ней имена классов AWT и их методов. Все компоненты AWT имеют своих наследников в Swing, и имена классов этих компонентов отличаются лишь префиксом «J» (например, тяжеловесная кнопка Button имеет в Swing свой легковесный аналог — кнопку JButton).
5

Окна Swing
Конструкторы
JFrame()
JFrame(String title)
Методы
setSize(int width, int height)
setDefaultCloseOperation(int operation)
setVisible(boolean visible)
6

Окна Swing
Легковесные компоненты Swing унаследованы от класса JComponent. Для легковесных компонеттов должен иметься тяжеловесный контейнер, который будет отвечать за прорисовку всех содержащихся в нем легковесных компонентов. В AWT такими контейнерами чаще всего служили окна Frame и Dialog, а также класс апплетов Applet. Swing предоставляет свои, слегка измененные тяжеловесные контейнеры высшего уровня: окна JWindow, JDialog и JFrame, а также апплет JApplet. Они наследуют напрямую от окон AWT.
Класс JWindow — простейшее окно, без рамки и без строки заголовка. Обычно с его помощью делается заставка к программе.
Класс JFrame, представляющий собой окно с рамкой и строкой заголовка (с кнопками «Свернуть», «Во весь экран» и «Закрыть»). Оно может изменять размеры и перемещаться по экрану.
Конструктор JFrame() без параметров создает пустое окно. Конструктор JFrame(String title) создает пустое окно с заголовком title.
Чтобы написать простейшую программу, выводящую на экран пустое окно, нам потребуется еще три метода:
setSize(int width, int height) — устанавливает размеры окна. Если не задать размеры, окно будет иметь нулевую высоту независимо от того, что в нем находится и пользователю после запуска придется растягивать окно вручную. Размеры окна включают не только «рабочую» область, но и границы и строку заголовка.
setDefaultCloseOperation(int operation) — позволяет указать действие, которое необходимо выполнить, когда пользователь закрывает окно нажатием на крестик. Обычно в программе есть одно или несколько окон при закрытии которых программа прекращает работу. Для того, чтобы
запрограммировать это поведение, следует в качестве параметра operation передать константу EXIT_ON_CLOSE, описанную в классе JFrame.
setVisible(boolean visible) — когда окно создается, оно по умолчанию невидимо. Чтобы отобразить окно на экране, вызывается данный метод с параметром true. Если вызвать его с параметром false, окно снова станет невидимым.
7

Swing
Пример . Простое окно
package prog1; import javax.swing.*;
public class Prog1
{public static void main (String[] args)
{JFrame myWindow =new JFrame("Пробное окно"); myWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); myWindow.setSize(400, 300);
myWindow.setVisible(true);
}
}
8

Swing
На слайде представлена программа, которая создает окно, выводит его на экран и завершает работу после того, как пользователь закрывает окно.
Для работы с большинством классов библиотеки Swing понадобится импортировать пакет java.swing.*
Как правило, перед отображением окна, необходимо совершить гораздо больше действий, чем в этой простой программе. Необходимо создать множество элементов управления, настроить их внешний вид, разместить в нужных местах окна. Кроме того, в программе может быть много окон и настраивать их все в методе main() неудобно и неправильно, поскольку нарушает принцип инкапсуляции: держать вместе данные и команды, которые их обрабатывают. Логичнее было бы, чтобы каждое окно занималось своими размерами и содержимым самостоятельно.
Классическая структура программы с окнами представлена на следующем слайде.
9

Swing
Пример . Классическая структура программы с окнами
// В файле SimpleWindow.java: package progr2;
import javax.swing.*;
class SimpleWindow extends JFrame
{ SimpleWindow(){ super("Пробное окно"); setDefaultCloseOperation(EXIT_ON_CLOSE); setSize(250, 100);
JButton newButton = new JButton("Кнопка"); getContentPane().add(newButton);
}
}
// В файле Progr2.java: package progr2;
import javax.swing.*;
public class Progr2
{ public static void main (String[] args)
{JFrame myWindow =new SimpleWindow(); myWindow.setVisible(true);
}
}
10