Введение в GUI
Возможности графических библиотек GUI-библиотеки Java (GUI – для standalone applications или applets) AWT – вызов native-компонентов => лишь общие возможности платформ Swing – наследование от AWT, но «легковесность» основных компонентов + полный набор возможностей как в MFC для Win32 + полная реализация ООП (=> гибкость) + авт. смена внешнего вида (L&F: win, motif, any). Но: сложность, требовательность к ресурсам SWT (от IBM) – аналог Swing, но много native-кода => экономичность Общие возможности AWT и Swing Рисование: Graphics, Graphics2D. Изображения (Image), анимации, звук Готовые графические компоненты (extends Component), их размещение на других (которые extends Container), layout managers События, возникающие при действиях пользователя с компонентами Сервисные возможности (см. Toolkit): определение настроек экрана, печать на принтере, clipboard (java.awt.datatransfer); drag-n-drop Дополнительные возможности Swing Контейнеры (внутр. окна, tabs, splits), доп. компоненты для показа (сообщений), редактирования (сложного текста,..), выбора (цветов, файлов, любых объектов: таблицы, деревья, списки, опции Выделение данных из компонентов хранителя данных – Model Double buffering, borders, tooltips, InputVerifier (1.3); undo и т.п. 1
2 Проблемы AWT Сходные элементы в различных ОС могут иметь некоторые различия ОС часто имеют элементы GUI, отсутствующие в других ОС Использование native-методов в AWT приводит к возникновению ошибок на конкретных платформах
3 Технология Swing Элементы GUI отрисовываются в пустых окнах «Нативные» функции используются только для вывода окна, отрисовки и получения информации о действиях пользователя Обладает свойством «легковесности» (lightweight)
4 Особенности Swing Набор элементов GUI более широк, чем в AWT, и может быть еще расширен Сильная привязка к «нативным» методам отсутсвует, что снижает вероятность возникновения ошибок Отображение на различных платформах единообразно
5 Look And Feel Программе можно придать различный вид, изменив «стиль» отрисовки компонентов Есть разработанные «стили» для базовых платформ Существет возможность создания собственных «стилей»
6 Windows
7 Motif
8 Java (Metal)
9 Иерархия классов
10 Иерархия классов. Пакет javax.swing
11 Оконные приложения в Swing Используется класс javax.swing.JFrame Содержимое окна находится на панели, ссылку на которую можно получить вызовом метода getContentPane() Параметрами окна можно управлять
12 class NotHelloWorldPanel extends JPanel { public void paintComponent(Graphics g) { super.paintComponent(g); g.drawString("Not a Hello, World program", MESSAGE_X, MESSAGE_Y); } public static final int MESSAGE_X = 75; public static final int MESSAGE_Y = 100; } Отрисовка компонентов Отрисовка производится в методе paintComponent() Для перерисовки по требованию вызывается метод repaint()
13 Двойная буферизация В целях экономии времени на перерисовку логично запоминать однажды нарисованный статичный объект как рисунок в памяти При использовании Swing для этого не надо предпринимать дополнительных действий по выделению памяти и.д. Используется т.н. механизм «двойной буферизации», реализующий сохранение информации на уровне механизмов отрисовки Для одного участка «видимой области» приложения используется не более одного изображения-буфера
14 Двойная буферизация Методы класса JComponent setDoubleBuffered(boolean aFlag) Устанавливает, буферизует ли объект свой вывод boolean isDoubleBuffered() Возвращает булевское значение, показывающее, используется ли двойная буферизация, или нет
15 Pluggable Look And Feel Внешний вид программы может изменяться во время исполнения Перерисовка должна вызываться принудительно String s; switch (value) { case 0: s = "javax.swing.plaf.metal.MetalLookAndFeel"; break; case 1: s = "com.sun.java.swing.plaf.motif.MotifLookAndFeel"; break; case 2: s = "com.sun.java.swing.plaf.windows.WindowsLookAndFeel"; break; default: s = UIManager.getSystemLookAndFeelClassName(); } UIManager.setLookAndFeel(s); SwingUtilities.updateComponentTreeUI(getContentPane());
16 Работа с графикой java.awt.Graphics2D Класс-наследник класса java.awt.Graphics, обеспечивающий большую функциональность java.awt.geom.* Содержит набор классов работы с графическими примитивами
17 Работа с меню javax.swing.JMenuBar Панель меню в верхней части окна javax.swing.JMenu Меню как таковое javax.swing.JMenuItem Единичный элемент меню javax.swing.JCheckBoxMenuItem Элемент меню «флажок» javax.swing.JRadioButtonMenuItem Элемент меню «радио-кнопка» javax.swing.JPopup Всплывающее меню
Модель обработки событий в Java Примеры событий действие пользователя приход данных (напр., из сети) завершение параллельно идущего процесса; и др. Данные о событии «пакуются» в объект класса *Event Шаблон Observer (Listener) Источник события не знает класса получателя (слушателя) Слушатель реализует интерфейс *Listener Слушатели должны быть зарегистрированы в источнике: add*Listener(*Listener). Также есть remove*Listener(*Listener) 18
19 Некоторые замечания Swing предоставляет более широкие и надежные возможности, чем AWT Эти возможности касаются в основном отрисовки компонентов Модель обработки событий и другие внутренние механизмы приложения относятся к AWT, а не к Swing Некорректно говорить, что Swing заменил AWT Современные средства разработки имеют визуальные редакторы для создания пользовательских интерфейсов
На что обратить внимание в API Обычные, диалоговые окна и апплеты в Swing: Все - RootPaneContainer //позволяет иметь JMenuBar, JToolBar rootPane, layeredPane, glassPane, contentPane. Надо contentPane.add()! setDefaultCloseOperation(int) //dispose, hide, exit, do nothing; т.е. свой listener Диалоги – дочерние! Модальность. JOptionPane – статический доступ С помощью JWindow можно сделать splash-окно при запуске программы Image и Icon: создание и использование Image i = toolkit.getImage(1.jpg); //gif,jpeg,png frame.setIconImage(i); javax.swing.Icon i=new ImageIcon(2.jpg); ((AbstractButton)b).setIcon(i); Некоторые возможности компонентов Подсказки: ((JComponent)c).setToolTipText(Выход); Границы: new TitledBorder(new EtchedBorder(), Адрес); Списки и т.п. надо помещать на JScrollPane: new JScrollPane(new JList()); 20