Proz S7 id 402997 Nieznany

background image

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.).

background image

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.

background image

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();

}

background image

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):

background image

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));

background image

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.

background image

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.

background image

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

ą

.

background image

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

ę

.

background image

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);

background image

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:

background image

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();
}
}

background image

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();
}
}

background image

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();
}
}

background image

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();

background image

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);

background image

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:

background image

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

ć

ż

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”.

background image

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.

background image

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

background image

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");

background image

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");

background image

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);

background image

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:

background image

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();
}

background image

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();
}

background image

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");

background image

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();

background image

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();

background image

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.

background image

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();

background image

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

background image

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


Wyszukiwarka

Podobne podstrony:
Proz S2 id 402992 Nieznany
Proz S12 id 402989 Nieznany
Proz S9 id 402999 Nieznany
Proz S8 id 402998 Nieznany
Proz S13 id 402990 Nieznany
Proz S4 id 402994 Nieznany
Proz S3 id 402993 Nieznany
Proz S14 id 402991 Nieznany
Proz S10 id 402987 Nieznany
Proz S5 id 402995 Nieznany
Proz S2 id 402992 Nieznany
Proz S12 id 402989 Nieznany
chemia proz maj 2011 cke id 112 Nieznany
MED CW 7 PLC S7 swiatla id 2919 Nieznany
Abolicja podatkowa id 50334 Nieznany (2)
4 LIDER MENEDZER id 37733 Nieznany (2)
katechezy MB id 233498 Nieznany
metro sciaga id 296943 Nieznany
perf id 354744 Nieznany

więcej podobnych podstron