Содержание

Слайд 2

План лекции Технология AWT и ее особенности Технология Swing и ее

План лекции

Технология AWT и ее особенности
Технология Swing и ее особенности
Иерархия компонентов

Swing
Обработка событий в Swing
Апплеты
Слайд 3

Графические приложения на Java Кроссплатформенное графическое приложение?.. Abstract Window Toolkit (AWT)

Графические приложения на Java

Кроссплатформенное графическое приложение?..
Abstract Window Toolkit (AWT)
Компоненты являются компонентами

ОС
Большое количество native-кода
Отображение изменяется при смене ОС
Класс java.awt.Component определяет базовую функциональность всех компонентов
Слайд 4

Иерархия классов AWT

Иерархия классов AWT

Слайд 5

Проблемы AWT Сходные элементы в различных ОС могут иметь некоторые различия

Проблемы AWT

Сходные элементы в различных ОС могут иметь некоторые различия
ОС часто

имеют элементы GUI, отсутствующие в других ОС
Использование native-методов в AWT приводит к возникновению ошибок на конкретных платформах
Слайд 6

Технология Swing Элементы GUI отрисовываются в пустых окнах «Нативные» функции используются

Технология Swing

Элементы GUI отрисовываются в пустых окнах
«Нативные» функции используются только для

вывода окна, отрисовки и получения информации о действиях пользователя
Набор элементов GUI более широк, чем в AWT, и может быть еще расширен
Сильная привязка к «нативным» методам отсутствует, что снижает вероятность возникновения ошибок
Отображение на различных платформах единообразно
Слайд 7

Иерархия классов

Иерархия классов

Слайд 8

Иерархия классов. Пакет javax.swing

Иерархия классов. Пакет javax.swing

Слайд 9

class NotHelloWorldPanel extends JPanel { public static final int MESSAGE_X =

class NotHelloWorldPanel extends JPanel {
public static final int MESSAGE_X =

75;
public static final int MESSAGE_Y = 100;
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawString("Not a Hello, World program", MESSAGE_X, MESSAGE_Y);
}
}

Отрисовка компонентов

Отрисовка производится в методе paintComponent()
Запрос на перерисовку
public void repaint()
public void repaint(long tm)
public void repaint(int x, int y, int width, int height)
public void repaint(long tm, int x, int y, int width, int height)

Слайд 10

Работа с графикой java.awt.Graphics Базовый класс, предназначенный для рисования в контекстах

Работа с графикой

java.awt.Graphics
Базовый класс, предназначенный для рисования в контекстах компонентов, изображениях

в памяти и т.д.
Предлагает простые средства рисования: void drawArc(int x, int y, int width, int height, int startAngle, int arcAngle) void drawString(String str, int x, int y) и т.д.
java.awt.Graphics2D
Наследует java.awt.Graphics, обеспечивающий большую функциональность, в т.ч. работа с 2D-сценой
java.awt.geom содержит набор классов работы с графическими примитивами
Слайд 11

Работа с цветом Класс java.awt.Color Константы Color.BLUE, Color.RED Покомпонентные конструкторы Color(float

Работа с цветом

Класс java.awt.Color
Константы Color.BLUE, Color.RED
Покомпонентные конструкторы Color(float r, float g, float b, float a) Color(ColorSpace cspace, float[] components,

float alpha)
Методы получения параметров цвета getRed(), getTransparency()
Слайд 12

Работа со шрифтами Класс java.awt.Font Константы Конструкторы Font(String name, int style,

Работа со шрифтами

Класс java.awt.Font
Константы
Конструкторы Font(String name, int style, int size)
Методы модификации и получения параметров

шрифта
Класс java.awt.FontMetrics
Содержит методы определения геометрических характеристик шрифтов
Слайд 13

Двойная буферизация В целях экономии времени на перерисовку логично запоминать однажды

Двойная буферизация

В целях экономии времени на перерисовку логично запоминать однажды нарисованный

статичный объект как рисунок в памяти
При использовании Swing для этого не надо предпринимать дополнительных действий по выделению памяти и.д.
Используется т.н. механизм «двойной буферизации», реализующий сохранение информации на уровне механизмов отрисовки
Для одного участка «видимой области» приложения используется не более одного изображения-буфера
Слайд 14

Двойная буферизация Методы класса JComponent setDoubleBuffered(boolean aFlag) Устанавливает, буферизует ли объект

Двойная буферизация

Методы класса JComponent
setDoubleBuffered(boolean aFlag) Устанавливает, буферизует ли объект свой вывод
boolean isDoubleBuffered() Возвращает

булевское значение, показывающее, используется ли двойная буферизация, или нет
Слайд 15

Pluggable Look And Feel Программе можно придать различный вид, изменив «стиль»

Pluggable Look And Feel

Программе можно придать различный вид, изменив «стиль» отрисовки

компонентов
Внешний вид программы может изменяться во время исполнения
Перерисовка должна вызываться принудительно
Есть разработанные «стили» для базовых платформ
Существует возможность создания собственных «стилей»
Слайд 16

Pluggable Look And Feel String s; switch (value) { case 0:

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());
Слайд 17

Windows

Windows

Слайд 18

Motif

Motif

Слайд 19

Java (Metal)

Java (Metal)

Слайд 20

Оконные приложения в Swing Используется класс javax.swing.JFrame Содержимое окна находится на

Оконные приложения в Swing

Используется класс javax.swing.JFrame
Содержимое окна находится на панели, ссылку на

которую можно получить вызовом метода getContentPane()
Параметрами окна можно управлять
Слайд 21

Пример оконного приложения import java.awt.*; import javax.swing.*; public class CenteredFrameTest {

Пример оконного приложения

import java.awt.*;
import javax.swing.*;
public class CenteredFrameTest {
public static void

main(String[] args) {
CenteredFrame frame = new CenteredFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
class CenteredFrame extends JFrame {
public CenteredFrame() {
Toolkit kit = Toolkit.getDefaultToolkit();
Dimension screenSize = kit.getScreenSize();
int screenHeight = screenSize.height;
int screenWidth = screenSize.width;
setSize(screenWidth / 2, screenHeight / 2);
setLocation(screenWidth / 4, screenHeight / 4);
Image img = kit.getImage("icon.gif");
setIconImage(img); setTitle("CenteredFrame");
}
}
Слайд 22

Работа с меню javax.swing.JMenuBar Панель меню в верхней части окна javax.swing.JMenu

Работа с меню

javax.swing.JMenuBar Панель меню в верхней части окна
javax.swing.JMenu Меню как таковое
javax.swing.JMenuItem Единичный элемент

меню
javax.swing.JCheckBoxMenuItem Элемент меню «флажок»
javax.swing.JRadioButtonMenuItem Элемент меню «радио-кнопка»
javax.swing.JPopup Всплывающее меню
Слайд 23

Менеджеры компоновки Управляют размещением компонентов в контейнере, учитывая параметры этих компонентов

Менеджеры компоновки

Управляют размещением компонентов в контейнере, учитывая параметры этих компонентов (например,

предпочтительный размер)
Реализуют интерфейс java.awt.LayoutManager
Устанавливаются с помощью метода setLayout() контейнера
Примеры простых компоновок:
Простая поточная компоновка FlowLayout
Поточная компоновка по вертикали/горизонтали BoxLayout
Компоновка в сетку GridLayout
Компоновка «Колода карт» CardLayout
Сетка с настраиваемыми размерами GridBagLayout
Граничная компоновка BorderLayout
Слайд 24

Примеры размещения компонентов

Примеры размещения компонентов

Слайд 25

Обработка событий Событие Классы событий в пакетах java.awt.event javax.swing.event Источник public

Обработка событий

Событие
Классы событий в пакетах
java.awt.event
javax.swing.event
Источник
public void addTypeListener (TypeListener el) throws java.util.TooManyListenersException
public

void removeTypeListener(TypeListener el)
Слушатель
Должен реализовывать методы для приема и обработки уведомлений
Существует набор интерфейсов TypeListener, описывающих методы обработки событий
Класс слушателя должен реализовывать интерфейс, соответствующий событию
Слайд 26

Некоторые типы и порождаемые события

Некоторые типы и порождаемые события

Слайд 27

Некоторые типы и порождаемые события

Некоторые типы и порождаемые события

Слайд 28

Пример приложения Часть 1 package swingdemo; import javax.swing.JOptionPane; public class DemoFrame

Пример приложения Часть 1

package swingdemo;
import javax.swing.JOptionPane;
public class DemoFrame extends javax.swing.JFrame {
private

javax.swing.JButton clearButton;
private javax.swing.JScrollPane scrollPane;
private javax.swing.JTextArea textArea;
public DemoFrame() {
initComponents();
}
private void initComponents() {
scrollPane = new javax.swing.JScrollPane();
textArea = new javax.swing.JTextArea();
clearButton = new javax.swing.JButton();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
Слайд 29

Пример приложения Часть 2 textArea.setColumns(20); textArea.setRows(5); scrollPane.setViewportView(textArea); clearButton.setText("Clear"); clearButton.addActionListener(new java.awt.event.ActionListener() {

Пример приложения Часть 2

textArea.setColumns(20);
textArea.setRows(5);
scrollPane.setViewportView(textArea);
clearButton.setText("Clear");
clearButton.addActionListener(new java.awt.event.ActionListener() {
public

void actionPerformed(java.awt.event.ActionEvent evt) {
clearButtonActionPerformed(evt);
}
});
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
Слайд 30

Пример приложения Часть 3 layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addContainerGap() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(scrollPane, javax.swing.GroupLayout.DEFAULT_SIZE,

Пример приложения Часть 3

layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(scrollPane, javax.swing.GroupLayout.DEFAULT_SIZE,
380, Short.MAX_VALUE)

.addGroup(javax.swing.GroupLayout.Alignment.TRAILING,
layout.createSequentialGroup()
.addGap(0, 0, Short.MAX_VALUE)
.addComponent(clearButton)))
.addContainerGap()));
Слайд 31

Пример приложения Часть 4 layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addContainerGap() .addComponent(scrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 251,

Пример приложения Часть 4

layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(scrollPane, javax.swing.GroupLayout.PREFERRED_SIZE,
251, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)

.addComponent(clearButton)
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE,
Short.MAX_VALUE)
)
);
Слайд 32

Пример приложения Часть 5 pack(); } private void clearButtonActionPerformed(java.awt.event.ActionEvent evt) {

Пример приложения Часть 5
pack();
}
private void clearButtonActionPerformed(java.awt.event.ActionEvent evt) {
if

(JOptionPane.showConfirmDialog(
rootPane,
"Are you sure you want to clear the text?",
"Confirmation",
JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) {
textArea.setText("");
}
}
}
Слайд 33

Общий вид окна программы-примера

Общий вид окна программы-примера

Слайд 34

События, слушатели и методы

События, слушатели и методы

Слайд 35

События, слушатели и методы

События, слушатели и методы

Слайд 36

События, слушатели и методы

События, слушатели и методы

Слайд 37

Классы-адаптеры Находятся в пакете java.awt.event Определены для интерфейсов слушателей того же

Классы-адаптеры

Находятся в пакете java.awt.event
Определены для интерфейсов слушателей того же пакета, содержащих

более одного метода
Являются пустыми реализациями соответствующего интерфейса
Наследники классов-адаптеров переопределяют необходимые методы
Слайд 38

Нерассмотренные возможности Компоненты и виды порождаемых событий Создание своих «стилей» отображения

Нерассмотренные возможности

Компоненты и виды порождаемых событий
Создание своих «стилей» отображения javax.swing.plaf
Вспомогательные классы JOptionPane, JFileChooser,

JColorChooser и т.д.
«Высокоинтеллектуальные» компоненты JTree, JTable и т.д.
Drag&Drop java.awt.dnd
Вывод на печать java.awt.print
Слайд 39

Понятие апплета Апплет (applet) – небольшое приложение, доступное на Интернет-сервере, транспортирующееся

Понятие апплета

Апплет (applet) – небольшое приложение, доступное на Интернет-сервере, транспортирующееся по

Интернет, автоматически устанавливающееся и выполняемое как часть Web-документа
В HTML-документ апплет встраивается с помощью тегов и
После доставки к клиенту апплет имеет ограниченный доступ к ресурсам системы
Слайд 40

Простейший апплет import java.awt.*; import java.applet.*; /* */ public class HelloWorldApplet

Простейший апплет

import java.awt.*;
import java.applet.*;
/*


*/
public class HelloWorldApplet

extends Applet {
public void paint(Graphics g) {
g.drawString("Hello World!", 20, 20);
}
}
Слайд 41

Тэг CODE = appletFile.class OBJECT = appletSerialFile WIDTH = pixels HEIGHT

Тэг

CODE = appletFile.class
OBJECT = appletSerialFile
WIDTH = pixels

HEIGHT = pixels
[ARCHIVE = jarFiles]
[CODEBASE = codebaseURL]
[ALT = alternateText]
[NAME = appletInstanceName]
[ALIGN = alignment]
[VSPACE = pixels]
[HSPACE = pixels]
>
[< PARAM NAME = AttributeNamel VALUE = AttributeValuel >]
[< PARAM NAME = AttributeName2 VALUE = AttributeValue2 >]
[HTML-code if there is no Java support]

Слайд 42

Тэг Simple Graph Simple Graph alt="Browser understands tag but isn't running

Тэг



Simple Graph


Simple Graph


width="300" height="120">
alt="Browser understands tag but isn't running the applet"
Browser is completely ignoring the tag!



Слайд 43

Тэг Simple Graph Simple Graph --> type="application/x-java-applet" height="300" width="550" > height="300" width="550" > -->

Тэг



Simple Graph


Simple Graph



type="application/x-java-applet"
height="300" width="550" >

height="300" width="550" >







Слайд 44

Отладочная печать Может выводиться на консоль и в статусную строку программы

Отладочная печать

Может выводиться на консоль и в статусную строку программы просмотра

апплетов
В браузере можно получить доступ к консоли: Netscape: Options>Show Java Console IE: Tools>Sun Java Console
А можно и не получить…
Слайд 45

Класс Applet java.applet.Applet Является классом-предком для любого апплета, включаемого в web-страницу

Класс Applet

java.applet.Applet
Является классом-предком для любого апплета, включаемого в web-страницу или просматриваемого

в Java Applet Viewer
При наследовании обычно переопределяется ряд методов
Слайд 46

Скелетная структура апплета void init() Вызывается один раз при инициализации void

Скелетная структура апплета

void init() Вызывается один раз при инициализации
void start() Вызывается каждый раз

при выводе документа, содержащего апплет, на экран
void stop() Вызывается каждый раз, когда браузер покидает документ, содержащий апплет
void destroy() Вызывается один раз, когда выполнение апплета заканчивается
Слайд 47

Апплеты в Swing Используется класс javax.swing.JApplet Содержимое аплета находится на панели,

Апплеты в Swing

Используется класс javax.swing.JApplet
Содержимое аплета находится на панели, ссылку на которую

можно получить вызовом метода getContentPane()
Для добавление элементов используется её метод add()
Апплет может являться полноценным Swing-приложением
Слайд 48

Пример апплета с использованием компонентов import java.awt.*; import java.awt.event.*; import java.net.*;

Пример апплета с использованием компонентов

import java.awt.*;
import java.awt.event.*;
import java.net.*;
import java.applet.*;
import javax.swing.*;
public class SwingApplet

extends JApplet {
JButton button;
public void init() {
String laf = UIManager.getSystemLookAndFeelClassName();
try {
UIManager.setLookAndFeel(laf);
} catch (UnsupportedLookAndFeelException exc) {
System.err.println("Warning: UnsupportedLookAndFeel: " + laf);
} catch (Exception exc) {
System.err.println("Error loading " + laf + ": " + exc);
}
getContentPane().setLayout(new FlowLayout());
button = new JButton("Hello, I'm a Swing Button!");
getContentPane().add(button);
}
}
Слайд 49

Пример апплета с обработкой событий /* */ import java.applet.*; import java.awt.*;

Пример апплета с обработкой событий

/*
*/
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
public class Scribble2 extends JApplet implements MouseListener, MouseMotionListener {
private int lastX, lastY;
public void init() {
this.addMouseListener(this) ;
this.addMouseMotionListener(this);
}
public void mousePressed(MouseEvent e) {
lastX = e.getX();
lastY = e.getY();
}

Слайд 50

Пример апплета с обработкой событий public void mouseDragged(MouseEvent e) { Graphics

Пример апплета с обработкой событий
public void mouseDragged(MouseEvent e) {
Graphics

g = this.getGraphics();
int x = e.getX(), y = e.getY();
g.drawLine(lastX, lastY, x, y);
lastX = x; lastY = y;
}
public void mouseReleased(MouseEvent e) {}
public void mouseClicked(MouseEvent e) {}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
public void mouseMoved(MouseEvent e) {}
}
Слайд 51

Результат работы программы

Результат работы программы

Слайд 52

Спасибо за внимание!

Спасибо за внимание!