Обработка событий в AWT. Классы-обертки (Java)

Содержание

Слайд 2

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

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

Слайд 3

Событие Событие – объект, описывающий, что произошло Источник – объект, сгенерировавший

Событие

Событие – объект, описывающий, что произошло
Источник – объект, сгенерировавший событие
Обработчик события

– метод, получающий объект «событие» и реагирующий на него
Слайд 4

Слайд 5

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

Модель делегирования

Событие может посылаться нескольким обработчикам

Слайд 6

import java.awt.*; import java.awt.event.*; public class TestButton { private Frame f;

import java.awt.*;
import java.awt.event.*;
public class TestButton {
private Frame f;
private Button

b;
public TestButton() {
f = new Frame("Test");
b = new Button("Press Me!");
b.setActionCommand("ButtonPressed");
}
public void launchFrame() {
b.addActionListener(new ButtonHandler());
f.add(b, BorderLayout.CENTER);
f.pack();
f.setVisible(true);
}
public static void main(String args[]) {
TestButton guiApp = new TestButton();
guiApp.launchFrame();
}
}

class ButtonHandler implements ActionListener {
public void actionPerformed(ActionEvent e) {
System.out.println("Action occurred");
System.out.println("Button’s command is: "
+ e.getActionCommand());
}
}

Слайд 7

Категории событий

Категории событий

Слайд 8

Слайд 9

Слайд 10

import java.awt.*; import java.awt.event.*; public class TwoListener implements MouseMotionListener, MouseListener {

import java.awt.*;
import java.awt.event.*;
public class TwoListener implements MouseMotionListener, MouseListener {
private Frame

f;
private TextField tf;
public TwoListener() {
f = new Frame("Two listeners example");
tf = new TextField(30);
}
public void launchFrame() {
Label label = new Label("Click and drag the mouse");
f.add(label, BorderLayout.NORTH);
f.add(tf, BorderLayout.SOUTH);
f.addMouseMotionListener(this);
f.addMouseListener(this);
f.setSize(300, 200);
f.setVisible(true);
}
Слайд 11

public void mouseDragged(MouseEvent e) { String s = "Mouse dragging: X

public void mouseDragged(MouseEvent e) {
String s = "Mouse dragging:

X = " + e.getX() + " Y = " + e.getY();
tf.setText(s);
}
public void mouseEntered(MouseEvent e) {
String s = "The mouse entered";
tf.setText(s);
}
public void mouseExited(MouseEvent e) {
String s = "The mouse has left the building";
tf.setText(s);
}
Слайд 12

public void mouseMoved(MouseEvent e) { } public void mousePressed(MouseEvent e) {

public void mouseMoved(MouseEvent e) {
}
public void mousePressed(MouseEvent e)

{
}
public void mouseClicked(MouseEvent e) {
}
public void mouseReleased(MouseEvent e) {
}
public static void main(String args[]) {
TwoListener two = new TwoListener();
two.launchFrame();
}
}
Слайд 13

Задание Добавить к написанной программе возможность закрытия окна Использовать метод dispose() для окна или System.exit(0);

Задание

Добавить к написанной программе возможность закрытия окна
Использовать метод dispose() для окна

или System.exit(0);
Слайд 14

Адаптеры Адаптер – это класс-слушатель, реализующий все методы интерфейса в виде

Адаптеры

Адаптер – это класс-слушатель, реализующий все методы интерфейса в виде пустых

заглушек
Создайте наследника этого класса и переопределите только те методы, которые Вам нужны
Слайд 15

import java.awt.*; import java.awt.event.*; public class MouseClickHandler extends MouseAdapter { public

import java.awt.*;
import java.awt.event.*;
public class MouseClickHandler extends MouseAdapter {
public void mouseClicked(MouseEvent e)

{
//...
}
}
Слайд 16

Задание Добавить к написанной ранее программе возможность закрытия окна Использовать метод dispose() Использовать WindowAdapter

Задание

Добавить к написанной ранее программе возможность закрытия окна
Использовать метод dispose()
Использовать WindowAdapter

Слайд 17

Обработка событий В основном классе Во внешнем классе Во вложенном классе В анонимном классе

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

В основном классе
Во внешнем классе
Во вложенном классе
В анонимном классе

Слайд 18

Обработка событий в том же классе import java.awt.*; import java.awt.event.*; public

Обработка событий в том же классе

import java.awt.*;
import java.awt.event.*;
public class FrameClass implements

ActionListener {
int counter;
Frame f = new Frame();
Label label = new Label("" + counter);
Button incButton = new Button("+");
Button decButton = new Button("-");
public FrameClass() {
incButton.addActionListener(this);
decButton.addActionListener(this);
f.add(incButton, BorderLayout.EAST);
f.add(decButton, BorderLayout.WEST);
f.add(label, BorderLayout.CENTER);
f.pack();
f.setVisible(true);
}
Слайд 19

public void actionPerformed(ActionEvent e) { if (e.getActionCommand().equals("+")) { label.setText("" + ++counter);

public void actionPerformed(ActionEvent e) {
if (e.getActionCommand().equals("+")) {
label.setText("" + ++counter);


} else if (e.getActionCommand().equals("-")) {
label.setText("" + --counter);
}
}
public static void main(String[] args) {
new FrameClass();
}
}

Обработка событий в том же классе (продолжение)

Один обработчик для одного типа событий
Чем больше компонентов, тем более громоздкий обработчик

Слайд 20

Обработка событий во внешних классах import java.awt.*; import java.awt.event.*; public class

Обработка событий во внешних классах

import java.awt.*;
import java.awt.event.*;
public class FrameClass {
int

counter;
Frame f = new Frame();
Label label = new Label("" + counter);
Button incButton = new Button("+");
Button decButton = new Button("-");
public FrameClass() {
incButton.addActionListener(new IncActionListener(this));
decButton.addActionListener(new DecActionListener(this));
f.add(incButton, BorderLayout.EAST);
f.add(decButton, BorderLayout.WEST);
f.add(label, BorderLayout.CENTER);
f.pack();
f.setVisible(true);
}
public static void main(String[] args) {
new FrameClass();
}
}
Слайд 21

Обработка событий во внешних классах (продолжение) class IncActionListener implements ActionListener {

Обработка событий во внешних классах (продолжение)

class IncActionListener implements ActionListener {
private

FrameClass fm;
public IncActionListener(FrameClass fm) {
this.fm = fm;
}
public void actionPerformed(ActionEvent e) {
fm.label.setText("" + ++fm.counter);
}
}
class DecActionListener implements ActionListener {
private FrameClass fm;
public DecActionListener(FrameClass fm) {
this.fm = fm;
}
public void actionPerformed(ActionEvent e) {
fm.label.setText("" + --fm.counter);
}
}

Требуется много вспомогательного кода для организации доступа к полям и методам объекта основного класса

Слайд 22

Обработка событий во вложенных классах import java.awt.*; import java.awt.event.*; public class

Обработка событий во вложенных классах

import java.awt.*;
import java.awt.event.*;
public class FrameClass {
int

counter;
Frame f = new Frame();
Label label = new Label("" + counter);
Button incButton = new Button("+");
Button decButton = new Button("-");
public FrameClass() {
incButton.addActionListener(new IncActionListener());
decButton.addActionListener(new DecActionListener());
f.add(incButton, BorderLayout.EAST);
f.add(decButton, BorderLayout.WEST);
f.add(label, BorderLayout.CENTER);
f.pack();
f.setVisible(true);
}
public static void main(String[] args) {
new FrameClass();
}
Слайд 23

Обработка событий во вложенных классах (продолжение) class IncActionListener implements ActionListener {

Обработка событий во вложенных классах (продолжение)

class IncActionListener implements ActionListener {

public void actionPerformed(ActionEvent e) {
label.setText("" + ++counter); // Доступ через неявную ссылку
}
} // Конец вложенного класса
class DecActionListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
label.setText("" + --counter); // Доступ через неявную ссылку
}
} // Конец вложенного класса
} // Конец основного класса

Вложенный класс имеет неявную ссылку на внешний объект
Вспомогательного кода для хранения ссылки не требуется

Слайд 24

Обработка событий в анонимных классах import java.awt.*; import java.awt.event.*; public class

Обработка событий в анонимных классах

import java.awt.*;
import java.awt.event.*;
public class FrameClass {
int

counter;
Frame f = new Frame();
Label label = new Label("" + counter);
Button incButton = new Button("+");
Button decButton = new Button("-");
public static void main(String[] args) {
new FrameClass();
}
Слайд 25

Обработка событий в анонимных классах (продолжение) // Конструктор public FrameClass() {

Обработка событий в анонимных классах (продолжение)

// Конструктор
public FrameClass()

{
incButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
label.setText("" + ++counter);
}
});
decButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
label.setText("" + --counter);
}
});
f.add(incButton, BorderLayout.EAST);
f.add(decButton, BorderLayout.WEST);
f.add(label, BorderLayout.CENTER);
f.pack();
f.setVisible(true);
}
} // Конец основного класса

Анонимный класс имеет неявную ссылку на внешний объект
Вспомогательного кода для хранения ссылки не требуется
Имеет смысл использовать для коротких и простых обработчиков событий

Слайд 26

Слайд 27

Задание 1. Написать программу, которая вызывает графический пользовательский интерфейс с такими

Задание

1. Написать программу, которая вызывает графический пользовательский интерфейс с такими функциями:
слева

находятся панель и кнопка, после нажатия на которую панель меняет свой цвет на случайный;
справа находятся текстовое поле с 0 и две кнопки, при нажатии на которые значение в поле или увеличивается или уменьшается.
2. Реализовать работу банкомата — снятие и пополнение денег.
Слайд 28

Работа с меню Создать MenuBar и добавить его во Frame с

Работа с меню

Создать MenuBar и добавить его во Frame с предыдущего

задания с помощью setMenuBar
Создать один или несколько Menu и добавить их в MenuBar
Создать один или несколько MenuItem и добавить их в Menu