7. Pakiet
AWT
. Obsługa zdarze
ń
.
W. Kasprzak: Programowanie zdarzeniowe
7 - 1
7. Pakiet
AWT
. Obsługa zdarze
ń
.
7.1 Pakiet
AWT
-
Podstawowe komponenty
-
Zarz
ą
dzanie rozkładem
-
Systemy menu
7.2 Obsługa zdarze
ń
w
AWT
7. Pakiet
AWT
. Obsługa zdarze
ń
.
W. Kasprzak: Programowanie zdarzeniowe
7 - 2
7.1 Pakiet
AWT
1) Podstawowe komponenty - kontrolki
Pakiet java.awt.* (ang. Abstraction Window Toolkit) – podstawowa (w Java
1) biblioteka systemowa do tworzenia graficznego interfejsu użytkownika.
Klasy w pakiecie java.awt.* dzielimy na:
kontrolki (komponenty sterujące),
kontenery (komponenty grupujące),
klasy pomocnicze.
Kontrolki to elementarne komponenty przeznaczone do sterowania
przebiegiem programu (np.: Button, Label, TextField).
Kontenery pozwalają na pogrupowanie kontrolek i wspólne zarządzanie ich
rozmieszczaniem, wyglądem, przesuwem, usuwaniem itd. (np. Panel, Frame,
Dialog). Ponieważ kontener sam jest komponentem, więc w kontenerze
mogą być umieszczone w szczególności inne kontenery.
Klasy pomocnicze pozwalają kontrolować wygląd graficzny komponentów
(Color, Font, Menu, itd.).
7. Pakiet
AWT
. Obsługa zdarze
ń
.
W. Kasprzak: Programowanie zdarzeniowe
7 - 3
AWT zawiera nast
ę
puj
ą
ce komponenty steruj
ą
ce dla GUI:
•
przycisk (klasa
java.awt.Button
)
•
etykieta (klasa
java.awt.Label
)
•
pole tekstowe 1-wierszowe (klasa
java.awt.TextField
)
•
obszar edycyjny (klasa
java.awt.TextArea
)
•
okienko wyboru (klasa
java.awt.Checkbox
) i grupa wykluczaj
ą
cych
si
ę
okienek wyboru (
java.awt.CheckboxGroup
)
•
lista wyborów (klasa
java.awt.List
)
•
rozwijana lista wyborów (klasa
java.awt.Choice
)
•
pasek przewijania (klasa
java.awt.Scrollbar)
•
obszar wykre
ś
lania (klasa
java.awt.Canvas)
•
menu (klasy
java.awt.Menu, java.awt.MenuBar, java.awt.MenuItem,
java.awt.CheckboxMenuItem)
7. Pakiet
AWT
. Obsługa zdarze
ń
.
W. Kasprzak: Programowanie zdarzeniowe
7 - 4
AWT zawiera nast
ę
puj
ą
ce kontenery:
Kontenerami, które mog
ą
stanowi
ć
samodzielne okno w aplikacji, s
ą
java.awt.Window
i pochodne tej klasy:
Frame
i
Dialog
.
Klasa
java.awt.Panel
jest najprostszym kontenerem i jej obiekt
wyznacza przestrze
ń
dla wizualizacji zawartych w nim komponentów.
7. Pakiet
AWT
. Obsługa zdarze
ń
.
W. Kasprzak: Programowanie zdarzeniowe
7 - 5
Klasa
Window
Obiekt tej klasy ukazuje si
ę
na ekranie w postaci samodzielnego (głównego)
okna systemowego, ale bez tytułu, ramki i dekoracji. Klasy pochodne od
Window
wyposa
ż
one s
ą
dodatkowo w pasek tytułu, ramk
ę
z brzegiem i
„dekoracje”, pozwalaj
ą
ce u
ż
ytkownikowi zarz
ą
dza
ć
oknem.
Klasa
Frame.
W porównaniu z
Window
klasa ta umo
ż
liwia stworzenie dodatkowych
elementów okna: tytuł, ikony (i obsług
ę
) minimalizacji, zmiany rozmiarów i
zamkni
ę
cia okna, pasek menu, ramk
ę
z brzegiem.
public class Frame extends Window implements MenuContainer;
Konstruktory:
Frame() ;
Frame(String title);
W
ś
rodowisku wielo-ekranowym mo
ż
na utworzy
ć
ramk
ę
na ró
ż
nych
ekranach, stosuj
ą
c konstruktory:
Frame(GraphicsConfiguration gc);
Frame(String title, GraphicsConfiguration gc);
7. Pakiet
AWT
. Obsługa zdarze
ń
.
W. Kasprzak: Programowanie zdarzeniowe
7 - 6
Obiekt klasy
GraphicsConfiguration
specyfikuje kontekst graficzny dla ekranu.
Przykład.
Frame f = new Frame(gc);
Rectangle b = gc.getBounds();
f.setLocation(10 + b.x, 10 + b.y);
Jak pobra
ć
taki kontekst?
GraphicsEnvironment ge
= GraphicsEnvironment. getLocalGraphicsEnvironment();
GraphicsDevice[] gs = ge.getScreenDevices();
for (int j = 0; j < gs.length; j++) {
GraphicsDevice gd = gs[j];
GraphicsConfiguration[] gc = gd.getConfigurations();
}
7. Pakiet
AWT
. Obsługa zdarze
ń
.
W. Kasprzak: Programowanie zdarzeniowe
7 - 7
Typowa kolejno
ść
inicjalizacji
GUI
w
AWT
z u
ż
yciem
Frame
1) Utworzenie obiektu ramki. Np.
Frame okno1 = new Frame(„Moje okno”);
2) Ustawienie zarz
ą
dcy rozkładu komponentów. Np.
okno1.setLayout(new BorderLayout(10,20));
3) Dodanie komponentów do kontenera. Np.
okno1.add(new Button(„Start”), BorderLayout.NORTH);
okno1.add(new Button(“Move”), BorderLayout.CENTER):
4) Ustawienie rozmiaru okna. Np.
okno1.setSize(100, 200);
5) Upakowanie i rozmieszczenie komponentów w oknie. Np.
okno1.pack();
6) Aby pocz
ą
tkowo niewidoczne okno uczyni
ć
widocznym na ekranie
nale
ż
y wywoła
ć
show()
lub
setVisible(true)
. Np.
okno1.show();
okno1.setVisible(true);
Odwrotn
ą
w stosunku do
show()
operacj
ą
jest
hide()
.
7. Pakiet
AWT
. Obsługa zdarze
ń
.
W. Kasprzak: Programowanie zdarzeniowe
7 - 8
Przykład 7.1.
Pokazanie samodzielnego okna.
import java.awt.*;
public class JednoOkno extends Frame {
public JednoOkno() {
setSize(400,100);
setVisible(true);
// Wizualizacja obiektu
}
public static void main(String args[]) {
new JednoOkno();
}
}
Wynik uruchomienia programu (z takim oknem nic wi
ę
cej – poza
akcjami dla trzech ikon - nie zrobimy):
7. Pakiet
AWT
. Obsługa zdarze
ń
.
W. Kasprzak: Programowanie zdarzeniowe
7 - 9
Klasa Label (etykieta)
Słu
ż
y ona do wy
ś
wietlania pojedynczej linii nieedytowalnego tekstu. Jej
trzy statyczne pola:
CENTER, LEFT i RIGHT
; okre
ś
laj
ą
sposób
ustawienia linii tekstu - odpowiednio: wy
ś
rodkowany, wyrównany do
lewej i wyrównany do prawej.
Przykład 7.2
Umie
ś
cimy w okienku obiekt klasy
Label
z tekstem po lewej
stronie.
import java.awt.*;
public class Etykieta extends Frame {
public Etykieta() {
Label etykieta = new Label();
// Nowa etykieta
etykieta.setText("Napis z lewej");
// zawiera napis
etykieta.setAlignment(Label.LEFT);
// Wyrównanie napisu do lewej
add(etykieta);
// Dodaj etykietę do ramki
pack();
// Opracuj ramkę
setSize(400,100);
// Ustaw rozmiar ramki
setVisible(true);
// Wizualizuj ramkę
}
7. Pakiet
AWT
. Obsługa zdarze
ń
.
W. Kasprzak: Programowanie zdarzeniowe
7 - 10
public static void main(String args[]){
new Etykieta();
}
}
Wynik uruchomienia:
Uwagi:
1) Tre
ść
napisu i sposób jego umieszczenia mo
ż
na wprowadzi
ć
bezpo
ś
rednio
do konstruktora obiektu klasy
Label:
Label etykieta = new Label("Napis z lewej", Label.LEFT);
2) Wywołanie konstruktora obiektu klasy
Label
mo
ż
na od razu umie
ś
ci
ć
w
metodzie
add
.
add(new Label("Napis z lewej", Label.LEFT));
3) Umieszczenie etykiety z tekstem na
ś
rodku lub z prawej strony,:
add(new Label("Napis na \u015brodku", Label.CENTER));
// lub
add(new Label("Napis z prawej", Label.RIGHT));
7. Pakiet
AWT
. Obsługa zdarze
ń
.
W. Kasprzak: Programowanie zdarzeniowe
7 - 11
Klasa
Button
(przycisk)
Zdarzenia:
ActionEvent, MouseEvent
Przykład 7.3
Uzupełniamy okno o jeden przycisk.
import java.awt.*;
public class Przycisk1 extends Frame {
public Przycisk1() {
add(new Button("Napis na przycisku"));
// Dodaj przycisk
pack();
setSize(400,100);
setVisible(true);
}
public static void main(String args[]) { new Przycisk1(); }
}
Wynik po uruchomieniu - przycisk zajmuje cały obszar klienta ramki.
7. Pakiet
AWT
. Obsługa zdarze
ń
.
W. Kasprzak: Programowanie zdarzeniowe
7 - 12
Przykład 7.4
Tworzymy obiekt klasy
Panel - następnie dodajemy do niego dwa
obiekty klasy Button, a na koniec obiekt klasy Panel dodajemy do obiektu głównego
- klasy Frame.
import java.awt.*;
public class Przycisk2 extends Frame {
public Przycisk2() {
Panel ppanel = new Panel();
// Utwórz kontener - panel
ppanel.add(new Button("Przycisk 1"));
// Utwórz i dodaj przycisk 1
ppanel.add(new Button("Przycisk 2"));
// Utwórz i dodaj przycisk 2
add(ppanel);
// Dodaj panel do ramki
pack();
setSize(400,100);
setVisible(true);
}
public static void main(String args[]) {
new Przycisk2();
}
}
Wynik – okno z 2 przyciskami.
7. Pakiet
AWT
. Obsługa zdarze
ń
.
W. Kasprzak: Programowanie zdarzeniowe
7 - 13
Klasa
Checkbox
(pole wyboru)
Zdarzenia:
ItemEvent
Przykład 7.5
import java.awt.*;
public class Pole1 extends Frame {
public Pole1() {
Panel ppanel = new Panel();
ppanel.add(new Checkbox("Pole wyboru 1", true));
// Stan początkowy pola wyboru: true albo false.
ppanel.add(new Checkbox("Pole wyboru 2", true));
// Zmiana parametru true na false powoduje zmianę stanu początkowego.
ppanel.add(new Checkbox("Pole wyboru 3", true));
add(ppanel);
pack();
setSize(400,100);
setVisible(true);
7. Pakiet
AWT
. Obsługa zdarze
ń
.
W. Kasprzak: Programowanie zdarzeniowe
7 - 14
}
public static void main(String args[]) {
new Pole1();
}
}
Wynik uruchomienia programu:
Klikanie myszk
ą
przeł
ą
cza stan obiektów klasy
Checkbox.
7. Pakiet
AWT
. Obsługa zdarze
ń
.
W. Kasprzak: Programowanie zdarzeniowe
7 - 15
Klasa
CheckboxGroup
- grupa wykluczaj
ą
cych si
ę
pól wyboru.
Obiekt tej klasy zawiera pola wyboru
– obiekty klasy
Checkbox
.
Zdarzenia:
ItemEvent
Przykład 7.6
import java.awt.*;
public class Przelacznik extends Frame {
public Przelacznik() {
Panel ppanel = new Panel();
CheckboxGroup cbg = new CheckboxGroup();
// Utwórz grupę
ppanel.add(new Checkbox("Opcja 1", cbg, true));
// Dodaj pole wyboru 1
ppanel.add(new Checkbox("Opcja 2", cbg, false));
// “ 2
ppanel.add(new Checkbox("Opcja 3", cbg, false));
// “ 3
ppanel.add(new Checkbox("Opcja 4", cbg, false));
// “ 4
add(ppanel);
pack();
setSize(400,100);
setVisible(true);
7. Pakiet
AWT
. Obsługa zdarze
ń
.
W. Kasprzak: Programowanie zdarzeniowe
7 - 16
}
public static void main(String args[]) {
new Przelacznik();
}
}
Wynik po uruchomieniu programu:
Stan obiektu mo
ż
na zmienia
ć
poprzez klikanie myszk
ą
.
7. Pakiet
AWT
. Obsługa zdarze
ń
.
W. Kasprzak: Programowanie zdarzeniowe
7 - 17
Klasa
Choice
(lista rozwijana opcji/wyborów)
– pozwala na wybór jednej
spo
ś
ród rozwijanej listy opcji
.
Zdarzenia:
ItemEvent
Przykład 7.7
Lista 5 opcji.
import java.awt.*;
public class Lista extends Frame {
public Lista() {
Choice llista = new Choice();
// Utwórz listę opcji
Panel ppanel = new Panel();
llista.add("Wyb\u00f3r 1");
// Dodaj opcję
llista.add("Wyb\u00f3r 2");
// ’’
llista.add("Wyb\u00f3r 3");
// ’’
llista.add("Wyb\u00f3r 4");
// ’’
llista.add("Wyb\u00f3r 5");
// ’’
ppanel.add(llista);
// Dodaj listę do panelu
add(ppanel);
pack();
7. Pakiet
AWT
. Obsługa zdarze
ń
.
W. Kasprzak: Programowanie zdarzeniowe
7 - 18
setSize(400,100);
setVisible(true);
}
public static void main(String args[]) {
new Lista();
}
}
Wynik uruchomienia programu:
Klikni
ę
cie myszk
ą
pozwala zmieni
ć
wybran
ą
opcj
ę
.
7. Pakiet
AWT
. Obsługa zdarze
ń
.
W. Kasprzak: Programowanie zdarzeniowe
7 - 19
Klasa
TextArea
- wielowierszowe pole tekstowe z mo
ż
liwo
ś
ci
ą
edycji.
Konstruktory
TextArea();
TextArea(String);
// Zawiera podany napis
TextArea(String, int, int);
// o podanym napisie i rozmiarze
TextArea(String, int, int, int);
// o podanym napisie, rozmiarze i suwakach
Przykład 7.8
import java.awt.*;
public class PoleTekstowe1 extends Frame {
public PoleTekstowe1() {
String str1 = new String("Pierwsza linia pola tekstowego\n");
String str2 = new String("Druga linia pola tekstowego\n");
String str3 = new String("Trzecia linia pola tekstowego\n");
String str4 = new String("Czwarta linia pola tekstowego\n");
String str5 = new String("Pi\u0105ta linia pola tekstowego\n");
String str6 = new String("Sz\u00f3sta linia pola tekstowego");
String napis = new String(str1 + str2 + str3 + str4 + str5 + str6);
7. Pakiet
AWT
. Obsługa zdarze
ń
.
W. Kasprzak: Programowanie zdarzeniowe
7 - 20
TextArea poleTekstu = new TextArea(napis);
// Utwórz pole tekstowe
add(poleTekstu);
poleTekstu.setEditable(false);
// Nieedytowalne pole tekstowe
pack();
setSize(400,100);
setVisible(true);
}
public static void main(String args[]){
new PoleTekstowe1();
}
}
Uwaga: program tworzy okienko z nieedytowalnym polem tekstowym,
ale tekst mo
ż
na zaznaczy
ć
myszk
ą
i zapami
ę
ta
ć
w schowku systemu.
Edytowalne pole tekstowe pojawi si
ę
po zmiana tylko jednej linii na:
poleTekstu.setEditable(true);
7. Pakiet
AWT
. Obsługa zdarze
ń
.
W. Kasprzak: Programowanie zdarzeniowe
7 - 21
2) Rozmieszczanie komponentów. Zarz
ą
dcy rozkładu
Jak kontrolowa
ć
rozmiar i poło
ż
enie komponentów wewn
ą
trz
kontenerów?
Mo
ż
na wykorzysta
ć
do tego celu tzw. zarz
ą
dców rozkładu. Ka
ż
dy
kontener posiada zarz
ą
dc
ę
rozkładu.
Interfejs
LayoutManager
to bazowy interfejs dla zarz
ą
dców rozkładu.
Wa
ż
niejsze klasy w AWT implementuj
ą
ce ten interfejs to:
FlowLayout,
GridLayout,
BorderLayout,
CardLayout,
GridBagLayout.
Budowanie własnego trybu zarz
ą
dzania rozkładem jest mo
ż
liwe tylko
po jawnym wył
ą
czeniu zarz
ą
dców rozkładu.
Przykład 7.9
Program z własnym zarz
ą
dc
ą
rozkładu.
import java.awt.*;
public class PrzyciskBZ extends Frame {
public PrzyciskBZ() {
7. Pakiet
AWT
. Obsługa zdarze
ń
.
W. Kasprzak: Programowanie zdarzeniowe
7 - 22
setLayout(null);
// Wyłączenie zarządców rozkładu
Button przycisk = new Button("OK");
przycisk.setBounds(70,42,60,30);
// Ustaw położenie i rozmiar przycisku
add(przycisk);
setSize(200,100);
setVisible(true) ;
}
public static void main(String args[]){
new PrzyciskBZ();
}
}
Wynik uruchomienia:
7. Pakiet
AWT
. Obsługa zdarze
ń
.
W. Kasprzak: Programowanie zdarzeniowe
7 - 23
Klasa BorderLayout
- zarz
ą
dca domy
ś
lny dla klas
Frame
i
Dialog
.
Pozwala na jednoczesne umieszczenie pi
ę
ciu komponentów (w tym
innych kontenerów):
-
4 s
ą
zwi
ą
zywane z brzegami:
North, East, South, West
-
a 1 jest centralny:
Center
Ustawienie zarz
ą
dcy rozkładu:
setLayout(new BorderLayout());
// bez odstepów pomiędzy komponentami
lub
// Odstępy pomiędzy komponentami wyniosą: h - w poziomie, v - w pionie:
setLayout(new BorderLayout(h, v));
Przykład 7.10
Wykorzystanie zarz
ą
dcy
BorderLayout dla ramki.
import java.awt.*;
public class BorderLay extends Frame {
public BorderLay() {
Button b1 = new Button("Strona lewa");
add(b1, BorderLayout.WEST);
//Dodaj przycisk dla lewego brzegu - West
Button b2 = new Button("Strona prawa");
add(b2, BorderLayout.EAST);
// Dodaj przycisk dla prawego brzegu
7. Pakiet
AWT
. Obsługa zdarze
ń
.
W. Kasprzak: Programowanie zdarzeniowe
7 - 24
Button b3 = new Button("Pole g\u00f3rne");
add(b3, BorderLayout.NORTH);
// Dodaj przycisk dla górnego brzegu
Button b4 = new Button("Pole dolne");
add(b4, BorderLayout.SOUTH);
// Dodaj przycisk dla dolnego brzegu
Button b5 = new Button("Centrum");
add(b5, BorderLayout.CENTER);
// Dodaj przycisk dla pola środkowego
pack();
setVisible(true);
}
public static void main(String args[]) {
new BorderLay();
}
}
7. Pakiet
AWT
. Obsługa zdarze
ń
.
W. Kasprzak: Programowanie zdarzeniowe
7 - 25
Klasa
FlowLayout
Domy
ś
lny zarz
ą
dca dla obiektów klasy
Panel
- umieszcza on
komponenty jeden za drugim; gdy kolejny komponent nie mie
ś
ci si
ę
w wierszu, zostaje przeniesiony do wiersza poni
ż
ej. Do
FlowLayout
mo
ż
na dodawa
ć
dowoln
ą
ilo
ść
komponentów.
FlowLayout();
Tworzy zarz
ą
dc
ę
z wypo
ś
rodkowanym rozmieszczaniem i
domy
ś
lnymi odst
ę
pami 5 pikseli w pionie i poziomie.
FlowLayout(int align);
Tworzy zarz
ą
dc
ę
z podanym rozmieszczaniem i
domy
ś
lnymi odst
ę
pami 5 pikseli w pionie i poziomie.
FlowLayout(int align, int hgap, int vgap);
Tworzy zarz
ą
dc
ę
z podanym
rozmieszczaniem i podanymi odst
ę
pami w poziomie i pionie.
Przykład 7.11
Wykorzystanie zarz
ą
dcy
FlowLayout
dla ramki.
import java.awt.*;
public class FlowLay extends Frame {
public FlowLay() {
setLayout(new FlowLayout());
// Nie będzie to domyślny zarządca
Button b1 = new Button("Opcja 1");
7. Pakiet
AWT
. Obsługa zdarze
ń
.
W. Kasprzak: Programowanie zdarzeniowe
7 - 26
add(b1);
Button b2 = new Button("Opcja 2");
add(b2);
Button b3 = new Button("Opcja 3");
add(b3);
Button b4 = new Button("Opcja 4");
add(b4);
Button b5 = new Button("Opcja 5");
add(b5);
pack();
setVisible(true);
}
public static void main(String args[]) {
new FlowLay();
}
}
7. Pakiet
AWT
. Obsługa zdarze
ń
.
W. Kasprzak: Programowanie zdarzeniowe
7 - 27
Klasa
GridLayout
Zarz
ą
dza oknem podzielonym na komórki - podczas jego tworzenia
podaje si
ę
ilo
ść
wierszy i kolumn. Kolejne komponenty umieszczane
s
ą
w komórkach od lewego górnego rogu pocz
ą
wszy, w kolejnych
wierszach od lewej do prawej strony lub od prawej-do-lewej (zale
ż
y to
od ustawienia własno
ś
ci
ComponentOrientation
dla kontenera).
Konstruktory
GridLayout();
Tworzy domy
ś
lnie jeden wiersz, a liczba kolumn zale
ż
y od
liczby komponentów.
GridLayout(int rows, int cols);
Tworzy podan
ą
liczb
ę
wierszy i kolumn.
GridLayout(int rows, int cols, int hgap, int vgap);
Tworzy podan
ą
liczb
ę
wierszy i
kolumn przy podanych odst
ę
pach w poziomie i pionie.
Przykład 7.12
. Wykorzystanie zarz
ą
dcy
GridLayout
dla ramki.
import java.awt.*;
public class GridLay extends Frame {
public GridLay() {
setLayout(new GridLayout(3,2));
// Inny niż domyślny zarządca –
// 3 wiersze, 2 kolumny.
7. Pakiet
AWT
. Obsługa zdarze
ń
.
W. Kasprzak: Programowanie zdarzeniowe
7 - 28
Button b1 = new Button("Pole: A1");
add(b1);
// 1-szy wersz, 1-sza kolumna
Button b2 = new Button("Pole: A2");
add(b2);
// 1-szy wiersz, 2-ga kolumna
Button b3 = new Button("Pole: B1");
add(b3);
Button b4 = new Button("Pole: B2");
add(b4);
Button b5 = new Button("Pole: C1");
add(b5);
Button b6 = new Button("Pole: C2");
add(b6);
pack();
setVisible(true);
}
public static void main(String args[]){
new GridLay();
}
}
7. Pakiet
AWT
. Obsługa zdarze
ń
.
W. Kasprzak: Programowanie zdarzeniowe
7 - 29
3) Stosowanie wielu zarz
ą
dców rozkładu
Przykład 7.13.
Wykorzystanie ró
ż
nych domy
ś
lnych zarz
ą
dców dla
obiektów klasy
Frame
i
Panel.
import java.awt.*;
public class BordFlow extends Frame {
public BordFlow() {
Panel ppanel1 = new Panel();
// Pierwszy panel …
ppanel1.add(new Checkbox("Wyb\u00f3r 1",true));
//zawiera 2 pola wyboru
ppanel1.add(new Checkbox("Wyb\u00f3r 2",true));
add(ppanel1, BorderLayout.WEST);
// Domyślny zarządca dla ramki to
// BorderLayout
Panel ppanel2 = new Panel();
// Drugi panel …
CheckboxGroup cbg = new CheckboxGroup();
// zawiera grupę pól wyboru
ppanel2.add(new Checkbox("Opcja 1", cbg, true));
// o 2 polach wyboru
ppanel2.add(new Checkbox("Opcja 2", cbg, false));
add(ppanel2, BorderLayout.EAST);
// Dodaj panel 2 dla prawego brzegu
7. Pakiet
AWT
. Obsługa zdarze
ń
.
W. Kasprzak: Programowanie zdarzeniowe
7 - 30
Label llabel = new Label("BorderLayout i FlowLayout", Label.CENTER);
add(llabel, BorderLayout.NORTH);
// Dodaj etykietę dla górnego brzegu
Panel ppanel3 = new Panel();
// Panel 3 …
ppanel3.add(new Button("Start"));
// zawiera 2 przyciski
ppanel3.add(new Button("Stop"));
add(ppanel3, BorderLayout.SOUTH);
// Dodaj panel 3 u dołu
String napis = "Tu mo\u017cna pisa\u0107,\nco si\u0119 chce....";
TextArea poleTekstu = new TextArea(napis, 8, 20);
// Pole tekstowe
poleTekstu.setEditable(true);
// edytowalne
add(poleTekstu, BorderLayout.CENTER);
// dodaj w środku ramki
pack();
setVisible(true);
}
public static void main(String args[]) {
new BordFlow();
7. Pakiet
AWT
. Obsługa zdarze
ń
.
W. Kasprzak: Programowanie zdarzeniowe
7 - 31
}
}
Po uruchomieniu otrzymujemy okno – domy
ś
lni zarz
ą
dcy
FlowLayout
(dla 4 paneli) i
BorderLayout
(dla ramki):
Przykład 7.14
Jawne doł
ą
czenie ró
ż
nych zarz
ą
dców rozkładu.
import java.awt.*;
public class BordGrid extends Frame {
public BordGrid() {
7. Pakiet
AWT
. Obsługa zdarze
ń
.
W. Kasprzak: Programowanie zdarzeniowe
7 - 32
Panel ppanel1 = new Panel();
// Ustawienie innego niż domyślny zarządcy rozkładu dla panelu 1
ppanel1.setLayout(new GridLayout(3,1));
// ustaw 3 wiersze po 1 kolumnie
ppanel1.add(new Checkbox("Wyb\u00f3r 1",true));
ppanel1.add(new Checkbox("Wyb\u00f3r 2",true));
ppanel1.add(new Checkbox("Wyb\u00f3r 3",true));
add(ppanel1, BorderLayout.WEST);
// Domyslny menadżer dla ramki –
// BorderLayout
Panel ppanel2 = new Panel();
// Ustalenie innego niż domyślny zarządcy rozkładu dla panelu 2
ppanel2.setLayout(new GridLayout(3,1));
// ustaw 3 wiersze po 1 kolumnie
CheckboxGroup cbg = new CheckboxGroup();
ppanel2.add(new Checkbox("Opcja 1", cbg, true));
ppanel2.add(new Checkbox("Opcja 2", cbg, false));
ppanel2.add(new Checkbox("Opcja 3", cbg, false));
add(ppanel2, BorderLayout.EAST);
Label llabel = new Label("BorderLayout i GridLayout", Label.CENTER);
7. Pakiet
AWT
. Obsługa zdarze
ń
.
W. Kasprzak: Programowanie zdarzeniowe
7 - 33
add(llabel, BorderLayout.NORTH);
//Etykieta umieszczona u górnego brzegu
// Panel 3 posiada domyślnego menadżera układu - FlowLayout
Panel ppanel3 = new Panel();
ppanel3.add(new Button("Start"));
ppanel3.add(new Button("Stop"));
add(ppanel3, BorderLayout.SOUTH);
// Pole tekstowe umieszczone w środku ramki
String napis = "Tu mo\u017cna pisa\u0107,\nco si\u0119 chce....";
TextArea poleTekstu = new TextArea(napis, 8, 20);
poleTekstu.setEditable(true);
add(poleTekstu, BorderLayout.CENTER);
pack();
setVisible(true);
}
public static void main(String args[]) {
new BordGrid();
}
7. Pakiet
AWT
. Obsługa zdarze
ń
.
W. Kasprzak: Programowanie zdarzeniowe
7 - 34
}
Dla dwóch paneli z lewej i prawej strony wł
ą
czono 2 zarz
ą
dców
GridLayout
– o 3 wierszach i 1 kolumnie:
7. Pakiet
AWT
. Obsługa zdarze
ń
.
W. Kasprzak: Programowanie zdarzeniowe
7 - 35
4) Tworzenie wielu okien
Je
ś
li maj
ą
to by
ć
okna takiego samego typu, tzn. b
ę
d
ą
ce obiektami
dziedzicz
ą
cymi po tej samej klasie - trzeba po prostu utworzy
ć
wiele
obiektów.
Przykład 7.15.a
import java.awt.*;
public class WieleOkien1 extends Frame {
public WieleOkien1(String napis) {
add(new Label(napis, Label.CENTER));
// Etykieta w środku ramki
pack();
setSize(400,100);
setVisible(true);
}
public static void main(String args[]) {
new WieleOkien1("Napis w pierwszym oknie");
// Ramka 1
new WieleOkien1("Napis w drugim oknie");
// Ramka 2
new WieleOkien1("Napis w trzecim oknie");
// Ramka 3
7. Pakiet
AWT
. Obsługa zdarze
ń
.
W. Kasprzak: Programowanie zdarzeniowe
7 - 36
}
}
Po uruchomieniu uka
żą
si
ę
trzy okna tego samego typu.
Gdy okna maj
ą
mie
ć
ró
ż
ny wygl
ą
d to trzeba zdefiniowa
ć
kilka klas.
Przykład 7.15.b
import java.awt.*;
public class WieleOkien2 extends Frame {
// Definicja nowego typu ramki
public WieleOkien2(String napis) {
add(new Label(napis, Label.CENTER));
// Zawiera etykietę w środku
pack();
setSize(400,100);
setVisible(true);
}
public static void main(String args[]) {
new WieleOkien2("Napis w pierwszym oknie");
// Pokaże ramkę 2.
new Przycisk("Napis na przycisku");
// Pokaże ramkę „przycisk”.
7. Pakiet
AWT
. Obsługa zdarze
ń
.
W. Kasprzak: Programowanie zdarzeniowe
7 - 37
new PoleTekstowe("Tu mo\u017cna pisa\u0107,\nco si\u0119 chce....");
// Pokaże ramkę „pole tekstowe”.
}
}
// -------------------------------
class Przycisk extends Frame {
// Definiuje ramkę “przycisk”
public Przycisk(String napis) {
add(new Button(napis));
pack();
setSize(400,100);
setVisible(true);
}
}
//---------------------------------
class PoleTekstowe extends Frame {
// Definiuje ramkę “pole tekstowe”
public PoleTekstowe(String napis) {
TextArea poleTekstu = new TextArea(napis);
add(poleTekstu);
7. Pakiet
AWT
. Obsługa zdarze
ń
.
W. Kasprzak: Programowanie zdarzeniowe
7 - 38
poleTekstu.setEditable(true);
pack();
setSize(400,100);
setVisible(true);
}
}
Po uruchomienia programu utworzone zostan
ą
trzy ró
ż
ne okna.
Uwagi
Definicje klas nie b
ę
d
ą
cych klas
ą
główn
ą
, czyli nie zawieraj
ą
cych
funkcji
main
s
ą
pozbawione
modyfikatora dost
ę
pu
public
.
Gdyby ka
ż
da klasa była zdefiniowana
w osobnym pliku
, modyfikator
public
byłby potrzebny.
7. Pakiet
AWT
. Obsługa zdarze
ń
.
W. Kasprzak: Programowanie zdarzeniowe
7 - 39
5) Systemy menu
Klasa bazowa wszystkich komponentów tworz
ą
cych menu
:
public abstract class MenuComponent extends Object implements Serializable;
Jej 2 klasy pochodne:
1.
Klasa
MenuBar
:
menu główne
, zwi
ą
zane z ramk
ą
.
2. Klasa
MenuItem
:
reprezentuje
opcje menu
. Opcje mog
ą
by
ć
trzech
postaci: zwykłe (
MenuItem
), wysuwne pod-menu (typu
Menu
) lub
specyficzne pole wyboru (typu
CheckboxMenuItem
).
public class PopupMenu extends Menu
;
Pop-up menu
(menu wysuwne) – mo
ż
e
pojawi
ć
si
ę
w dowolnym miejscu obszaru komponentu.
7. Pakiet
AWT
. Obsługa zdarze
ń
.
W. Kasprzak: Programowanie zdarzeniowe
7 - 40
Tworzenie menu zwi
ą
zanego z listw
ą
ramki - klasa
MenuBar
– pozwala
na grupowanie opcji, bed
ą
cych obiektami klasy
Menu
lub
MenuItem
.
Opcje dodawane s
ą
metod
ą
setHelpMenu
- dla tworzenia opcji „pomoc”
lub metod
ą
add
– dodaj
ą
c
ą
potencjalnie rozwijalne opcje (pod-menu).
Przykład 7.16.a
Okno z polem tekstowym uzupełnimy paskiem menu z
trzema opcjami.
import java.awt.*;
public class MenuSys1 extends Frame {
public MenuSys1() {
super("System Menu 1");
// Przekazujemy nazwę ramki do jej konstruktora
TextArea pT = new TextArea("Tu mo\u017cna pisa\u0107....", 8, 40);
pT.setEditable(true);
// Edytowalne pole tekstowe
add(pT);
// Dodaj pole tekstowe do ramki
MenuBar mb = new MenuBar();
// Tworzymy menu
setMenuBar(mb);
// Dołącz menu do listwy ramki – metoda klasy Frame
Menu file = new Menu("Plik");
// Tworzymy 1-szą opcję menu
mb.add(file);
// Dodaj opcję do menu
7. Pakiet
AWT
. Obsługa zdarze
ń
.
W. Kasprzak: Programowanie zdarzeniowe
7 - 41
Menu edit = new Menu("Edycja");
// Tworzymy 2-gą opcję menu
mb.add(edit);
// Dodaj 2-ga opcję do menu
Menu help = new Menu("Pomoc");
// Tworzymy 3-ią opcje menu
mb.setHelpMenu(help);
// Dodaj opcję jako opcję “pomocy” – może mieć
// specjalne miejsce na listwie menu.
pack();
}
public static void main(String args[]) {
(new MenuSys1()).show();
// Wizualizuj okno ze składowymi.
}
}
Wynik uruchomienia programu:
7. Pakiet
AWT
. Obsługa zdarze
ń
.
W. Kasprzak: Programowanie zdarzeniowe
7 - 42
Przykład 7.16.b
Cały proces tworzenia menu z przykładu 7.16.a,
zamiast
konstruktorze,
zamkniemy
w
dedykowanej
metodzie
setupMenu()
z modyfikatorem dost
ę
pu
protected.
import java.awt.*;
public class MenuSys1a extends Frame {
public MenuSys1a() {
super("System Menu 1");
TextArea pT = new TextArea("Tu mo\u017cna pisa\u0107....", 8, 40);
pT.setEditable(true);
add(pT);
setupMenu();
// Wywołujemy naszą metodę tworzącą menu
pack();
}
protected void setupMenu() {
// Nasza metoda, która tworzy menu główne
MenuBar mb = new MenuBar();
setMenuBar(mb);
Menu file = new Menu("Plik");
7. Pakiet
AWT
. Obsługa zdarze
ń
.
W. Kasprzak: Programowanie zdarzeniowe
7 - 43
mb.add(file);
Menu edit = new Menu("Edycja");
mb.add(edit);
Menu help = new Menu("Pomoc");
mb.setHelpMenu(help);
}
public static void main(String args[]) {
(new MenuSys1a()).show();
}
}
7. Pakiet
AWT
. Obsługa zdarze
ń
.
W. Kasprzak: Programowanie zdarzeniowe
7 - 44
Klasa
MenuItem
– wysuwne (rozwijalne) opcje menu.
Przykład 7.17
Rozbudujemy nasze menu dodaj
ą
c rozwijalne podmenu.
Umie
ś
cimy w nim tak
ż
e separator oraz opcj
ę
nieaktywn
ą
.
Zmodyfikowana metoda
setupMenu
() to:
protected void setupMenu() {
MenuBar mb = new MenuBar();
setMenuBar(mb);
Menu file = new Menu("Plik");
mb.add(file);
MenuItem open = new MenuItem("Otw\u00f3rz");
file.add(open);
// Dodaj opcję „Otwórz” do menu „Plik”.
MenuItem save = new MenuItem("Zachowaj");
file.add(save);
// Dodaj opcję „Zachowaj” do menu „Plik”.
file.add(new MenuItem("-"));
// Dodaj separator do menu „Plik”.
MenuItem quit = new MenuItem("Zamknij");
file.add(quit);
// Dodaj opcję „Zamknij” do menu „Plik”.
Menu edit = new Menu("Edycja");
7. Pakiet
AWT
. Obsługa zdarze
ń
.
W. Kasprzak: Programowanie zdarzeniowe
7 - 45
mb.add(edit);
MenuItem undo = new MenuItem("Cofnij");
edit.add(undo);
// Dodaj opcję „Cofnij” do menu „Edycja”.
MenuItem copy = new MenuItem("Kopiuj");
copy.setEnabled(false);
// Wyłączenie aktywności opcji „Kopiuj”
edit.add(copy);
// Dodaj opcję „Kopiuj” do menu „Edycja”.
Menu help = new Menu("Pomoc");
mb.setHelpMenu(help);
// Ustaw w menu głównym opcję “Pomoc”
MenuItem about = new MenuItem("O programie...");
help.add(about);
// Dodaj opcję „O programie...” do menu „Pomoc”.
}
Powstał
ę
opcje menu głównego mo
ż
na teraz rozwija
ć
.
7. Pakiet
AWT
. Obsługa zdarze
ń
.
W. Kasprzak: Programowanie zdarzeniowe
7 - 46
Uzupełnienie podopcji menu skrótami klawiszowymi
wymaga:
- uzupełnienia konstruktorów obiektów klasy
MenuItem
o konstruktory
obiektów klasy
MenuShortcut
,
- dodania polecenia importu pakietu
java.awt.event.*
.
Przykład 7.18
import java.awt.*;
import java.awt.event.*;
public class MenuSys3 extends Frame {
public MenuSys3() {
super("System Menu 1");
TextArea pT = new TextArea("Tu mo\u017cna pisa\u0107....", 8, 40);
pT.setEditable(true);
add(pT);
setupMenu();
pack();
}
protected void setupMenu() {
MenuBar mb = new MenuBar();
setMenuBar(mb);
7. Pakiet
AWT
. Obsługa zdarze
ń
.
W. Kasprzak: Programowanie zdarzeniowe
7 - 47
Menu file = new Menu("Plik");
mb.add(file);
MenuItem open = new MenuItem("Otw\u00f3rz",
new MenuShortcut(KeyEvent.VK_O));
// Klawisz skrótu CTRL+O
file.add(open);
MenuItem save = new MenuItem("Zachowaj",
new MenuShortcut(KeyEvent.VK_A));
// Klawisz skrótu CTRL+A
file.add(save);
file.add(new MenuItem("-"));
// Dodanie separatora
MenuItem quit = new MenuItem("Zamknij",
new MenuShortcut(KeyEvent.VK_K));
// Klawisz skrótu CTRL+K
file.add(quit);
Menu edit = new Menu("Edycja");
mb.add(edit);
MenuItem undo = new MenuItem("Cofnij",
new MenuShortcut(KeyEvent.VK_Z));
// Klawisz skrótu CTRL+Z
edit.add(undo);
MenuItem copy = new MenuItem("Kopiuj",
new MenuShortcut(KeyEvent.VK_C));
// Klawisz skrótu CTRL+C
7. Pakiet
AWT
. Obsługa zdarze
ń
.
W. Kasprzak: Programowanie zdarzeniowe
7 - 48
copy.setEnabled(false);
// Wyłączenie aktywności opcji
edit.add(copy);
Menu help = new Menu("Pomoc");
mb.setHelpMenu(help);
MenuItem about = new MenuItem("O programie...");
help.add(about);
}
public static void main(String args[]) {
(new MenuSys3()).show();
}
}
Wygl
ą
d menu po uruchomieniu programu:
7. Pakiet
AWT
. Obsługa zdarze
ń
.
W. Kasprzak: Programowanie zdarzeniowe
7 - 49
7.2 Zdarzenia w
AWT
1) Delegacyjny model obsługi zdarze
ń
Operacje u
ż
ytkownika na interfejsie graficznym, np. klikanie myszk
ą
,
prowadz
ą
do generacji tzw. zdarze
ń
dla okien (komponentów GUI). Te
zdarzenia sa przekazywane do obiektów, które si
ę
zarejestrowały w
danym oknie (komponencie GUI) jako tzw. słuchacze (obsługuj
ą
cy)
zdarzenia.
Obsługi zdarzenia mo
ż
e dokona
ć
obiekt klasy implementuj
ą
cej
odpowiedni interfejs zwi
ą
zany z danym rodzajem zdarze
ń
.
Najcz
ęś
ciej obsługiwanym rodzajem zdarze
ń
przychodz
ą
cych z GUI s
ą
zdarzenia typu akcja. Do obsługi tego rodzaju zdarze
ń
obiekt
odbieraj
ą
cy zdarzenie musi implementowa
ć
interfejs
ActionListener
z
pakietu
java.awt.event.*
7. Pakiet
AWT
. Obsługa zdarze
ń
.
W. Kasprzak: Programowanie zdarzeniowe
7 - 50
Przykład 7.19.
Prosta obsługa zdarzenia.
import java.awt.*;
import java.awt.event.*;
public class Zdarzenie1 extends Frame implements ActionListener{
public Zdarzenie1() {
Button action = new Button("Akcja");
action.addActionListener(this);
add(action, BorderLayout.CENTER);
pack();
setVisible(true);
}
public void actionPerformed(ActionEvent event) {
System.out.println(event.getActionCommand());
}
public static void main(String args[]) {
new Zdarzenie1();
}
7. Pakiet
AWT
. Obsługa zdarze
ń
.
W. Kasprzak: Programowanie zdarzeniowe
7 - 51
}
Po uruchomieniu programu klikanie w przycisk powoduje wy
ś
wietlanie
na konsoli napisu z nazw
ą
przycisku.
Uwagi:
1) Klasa główna programu implementuje
interface ActionListener
.
2) Obiekt słuchacza zdarze
ń
akcja, dodawany jest do obiektu klasy
Button
za pomoc
ą
metody
addActionListener
.
3) Po uruchomieniu programu klikanie w przycisk generuje zdarzenia
event
klasy
ActionEvent
, które s
ą
obsługiwane przez specjaln
ą
metod
ę
actionPerformed
. Metoda ta wy
ś
wietla na konsoli napis odzyskiwany ze
zdarzenia
event
za pomoc
ą
metody
getActionCommand
.
7. Pakiet
AWT
. Obsługa zdarze
ń
.
W. Kasprzak: Programowanie zdarzeniowe
7 - 52
2) Zdarzenie zamykania okna
Obsługa zdarzenia zamykania okna wymaga skorzystania z interfejsu
WindowListener.
Przykład
7.20
Stworzymy
klas
ę
implementuj
ą
c
ą
interfejs
WindowListener
.
import java.awt.*;
import java.awt.event.*;
public class Zdarzenie2 extends Frame {
public Zdarzenie2() {
add(new Button("Akcja"), BorderLayout.CENTER);
addWindowListener(new WindowHandler());
pack();
setVisible(true);
}
public static void main(String args[]) {
new Zdarzenie2();
}
7. Pakiet
AWT
. Obsługa zdarze
ń
.
W. Kasprzak: Programowanie zdarzeniowe
7 - 53
}
class WindowHandler implements WindowListener {
public void windowClosing(WindowEvent event) {
System.exit(0);
}
public void windowClosed(WindowEvent event) {}
// Puste definicje
public void windowOpened(WindowEvent event) {}
public void windowIconified(WindowEvent event) {}
public void windowDeiconified(WindowEvent event) {}
public void windowActivated(WindowEvent event) {}
public void windowDeactivated(WindowEvent event) {}
}
Klas
ą
implementuj
ą
c
ą
interfejs jest
WindowHandler
. Metod
ą
ko
ń
cz
ą
c
ą
działanie programu jest statyczna metoda
exit
klasy
System
. Parametr
jej wywołania przekazywany jest systemowi operacyjnemu. Zatem po
kompilacji i uruchomieniu okno da si
ę
zamkn
ąć
na kilka sposobów.
7. Pakiet
AWT
. Obsługa zdarze
ń
.
W. Kasprzak: Programowanie zdarzeniowe
7 - 54
3) Adaptery
Interfejs
WindowListener
zawiera siedem metod i wszystkie one musz
ą
zosta
ć
zaimplementowane, chocia
ż
nam potrzebna była tylko jedna
(st
ą
d tyle pustych, nic nie robi
ą
cych metod). Aby usun
ąć
z kodu
niepotrzebne w tym momencie implementacje metod trzeba skorzysta
ć
z adaptera.
Adapter jest to klasa, która zawiera puste implementacje metod
odpowiedniego interfejsu.
Przykład 7.21
Zmodyfikujemy poprzedni program z wykorzystaniem
adaptera, czyli obiektu klasy
WindowAdapter
, a tak
ż
ez upełnijmy go o
akcj
ę
zwi
ą
zan
ą
z głównym przyciskiem – o akcj
ą
zamkni
ę
cia okna.
import java.awt.*;
import java.awt.event.*;
public class Zdarzenie4 extends Frame implements ActionListener {
public Zdarzenie4() {
Button action = new Button("Zamknij");
7. Pakiet
AWT
. Obsługa zdarze
ń
.
W. Kasprzak: Programowanie zdarzeniowe
7 - 55
action.addActionListener(this);
add(action, BorderLayout.CENTER);
addWindowListener(new WindowHandler());
pack();
setVisible(true);
}
public void actionPerformed(ActionEvent event) {
System.exit(0);
}
public static void main(String args[]) { new Zdarzenie4(); }
}
class WindowHandler extends WindowAdapter {
public void windowClosing(WindowEvent event) {
System.exit(0);
}
}
Po uruchomieniu otrzymamy okno które da si
ę
zamkn
ąć
na
maksymaln
ą
liczb
ę
sposobów.
7. Pakiet
AWT
. Obsługa zdarze
ń
.
W. Kasprzak: Programowanie zdarzeniowe
7 - 56
4) Zdarzenia obsługi menu
Zamykanie okna z systemem menu
Przykład 7.22
Do programu tworz
ą
cego okno z paskiem menu dodamy
obsług
ę
zdarze
ń
zwi
ą
zanych z zamykaniem okna - przy pomocy
metody
addWindowListener
i klasy
WindowHandler
dziedzicz
ą
cej po
WindowAdapter
. Zamiast metody
setVisible,
wołanej w konstruktorze
klasy, skorzystamy z metody
show
wołanej na rzecz samego obiektu.
import java.awt.*;
import java.awt.event.*;
public class MenuSys4 extends Frame {
public MenuSys4(){
super("System Menu 1");
TextArea pT = new TextArea("Tu mo\u017cna pisa\u0107....", 8, 40);
pT.setEditable(true);
add(pT);
addWindowListener(new WindowHandler());
setupMenu();
7. Pakiet
AWT
. Obsługa zdarze
ń
.
W. Kasprzak: Programowanie zdarzeniowe
7 - 57
pack();
}
protected void setupMenu() {
... // Bez zmian w porównaniu do przykładu 7.18
}
public static void main(String args[]) {
(new MenuSys4()).show();
}
}
class WindowHandler extends WindowAdapter {
public void windowClosing(WindowEvent event) {
System.exit(0);
}
}
7. Pakiet
AWT
. Obsługa zdarze
ń
.
W. Kasprzak: Programowanie zdarzeniowe
7 - 58
Obsługa akcji opcji menu
Przykład 7.23
Teraz dodamy do programu z 7.22 obsług
ę
zdarzenia
zwi
ą
zanego z wyborem podopcji Zamknij opcji menu Plik, dodaj
ą
c do
odpowiedniego obiektu klasy
MenuItem
słuchacza, czyli obiekt
implementuj
ą
cy interfejs
ActionListener
. Dodamy równie
ż
metod
ę
obsługuj
ą
c
ą
zdarzenie
actionPerformed
.
import java.awt.*;
import java.awt.event.*;
public class MenuSys5 extends Frame implements ActionListener {
public MenuSys5() {
super("System Menu 1");
TextArea pT = new TextArea("Tu mo\u017cna pisa\u0107....", 8, 40);
pT.setEditable(true);
add(pT);
addWindowListener(new WindowHandler());
setupMenu();
pack();
7. Pakiet
AWT
. Obsługa zdarze
ń
.
W. Kasprzak: Programowanie zdarzeniowe
7 - 59
}
protected void setupMenu() {
MenuBar mb = new MenuBar();
setMenuBar(mb);
Menu file = new Menu("Plik");
mb.add(file);
... //
Ś
rodkowa cz
ęść
bez zmian w porównaniu z przykładem 7.18
MenuItem quit = new MenuItem("Zamknij",
new MenuShortcut(KeyEvent.VK_K));
quit.addActionListener(this);
// Dodanie słuchacza dla opcji “Zamknij”
file.add(quit);
... // Reszta metody - bez zmian
}
public void actionPerformed(ActionEvent event) {
if (event.getActionCommand().startsWith("Zamknij")) {
System.exit(0);
}
}
7. Pakiet
AWT
. Obsługa zdarze
ń
.
W. Kasprzak: Programowanie zdarzeniowe
7 - 60
public static void main(String args[]) {
(new MenuSys5()).show();
}
}
class WindowHandler extends WindowAdapter {
public void windowClosing(WindowEvent event) {
System.exit(0);
}
}
Teraz program daje si
ę
zamyka
ć
równie
ż
podopcj
ą
menu Zamknij oraz
skrótem klawiszowym
Ctrl+K.
7. Pakiet
AWT
. Obsługa zdarze
ń
.
W. Kasprzak: Programowanie zdarzeniowe
7 - 61
5) Zdarzenia typu
MouseListener
Interfejs
MouseListener
przewiduje metody obsługi zdarze
ń
myszy
wywoływanych dla kontrolek GUI.
Przykład 7.24
Ilustracja podstawowych zdarze
ń
MouseListener
w
aplecie. Celem apletu
ClickMe
jest wy
ś
wietlenie czerwonej plamki, gdy
u
ż
ytkownik kliknie w obszar graficzny ekranu zwi
ą
zany z apletem.
Mamy dwa pliki
ź
ródłowe:
ClickMe.java
i
Spot.java
.
// Plik ClickMe.java
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
public class ClickMe extends Applet implements MouseListener {
private Spot spot = null;
private static final int RADIUS = 7;
public void init() {
addMouseListener(this);
// rejestruj obsługę zdarzenia
7. Pakiet
AWT
. Obsługa zdarze
ń
.
W. Kasprzak: Programowanie zdarzeniowe
7 - 62
}
public void paint(Graphics g) {
// wykreśl czarną ramkę i białe tło
g.setColor(Color.white);
g.fillRect(0, 0, getSize().width - 1, getSize().height - 1);
g.setColor(Color.black);
g.drawRect(0, 0, getSize().width - 1, getSize().height - 1);
// wyświetl plamkę
g.setColor(Color.red);
if (spot != null) { g.fillOval (spot.x - RADIUS,
spot.y – RADIUS , RADIUS * 2, RADIUS*2);
}
}
public void mousePressed(MouseEvent event) {
if (spot == null) { spot = new Spot(RADIUS);
}
// warunkowe tworzenie obiektu klasy Spot
spot.x = event.getX();
spot.y = event.getY();
7. Pakiet
AWT
. Obsługa zdarze
ń
.
W. Kasprzak: Programowanie zdarzeniowe
7 - 63
repaint();
}
public void mouseClicked(MouseEvent event) {}
public void mouseReleased(MouseEvent event) {}
public void mouseEntered(MouseEvent event) {}
public void mouseExited(MouseEvent event) {}
}
// Plik Spot.java:
public class Spot {
public int size;
public int x, y;
public Spot(int intSize) {
size = intSize;
x = -1; y = -1;
}
}
7. Pakiet
AWT
. Obsługa zdarze
ń
.
W. Kasprzak: Programowanie zdarzeniowe
7 - 64
Interfejsy w aplecie ClickMe
Aplet ClickMe wyświetla czerwoną plamkę w reakcji na zdarzenie myszy
mouseClicked.
Wymagania wobec obiektu, który chce być powiadamiany o zdarzeniach
myszy:
o
jego klasa musi implementować interfejs MouseListener;
o
obiekt musi się zarejestrować jako "mouse listener".
Interfejs MouseListener deklaruje 5 metod, każdy aplet implementujący ten
interfejs musi zdefiniować wszystkie z nich (w przypadku klasy ClickMe 4
metody mają kod pusty).
public class ClickMe extends Applet
implements MouseListener
{
// Deklaracja implementowania interfejsu
...
addMouseListener(this);
// Rejestracja obiektu jako
// realizującego zadania „MouseListener”
public void mousePressed(MouseEvent event) {
// Implementacja 1-szej metody
7. Pakiet
AWT
. Obsługa zdarze
ń
.
W. Kasprzak: Programowanie zdarzeniowe
7 - 65
if (spot == null) { spot = new Spot(RADIUS); }
spot.x = event.getX();
spot.y = event.getY();
repaint();
}
// Implementacje puste 4 pozostałych metod
public void mouseClicked(MouseEvent event) {}
public void mouseReleased(MouseEvent event) {}
public void mouseEntered(MouseEvent event) {}
public void mouseExited(MouseEvent event) {}
}
// Klasy bazowe i interfejsy podane są w dokumentacji API:
•
•java.applet.Applet
•
•java.awt.Graphics
•
java.awt.Color
•
•java.awt.event.MouseListener
•
java.awt.event.MouseEvent