background image

13. Swing - obsługa zdarze

ń

 

W. Kasprzak: Programowanie zdarzeniowe 

13 - 1 

13. Swing - obsługa zdarze

ń

 

 

13.1 Przykłady 

13.2 Zasady 

13.3 Typy zdarze

ń

 

13.4 Implementowanie obsługi zdarze

ń

 

13.5 

Action

Abstract Action

 

 

13. Swing - obsługa zdarze

ń

 

W. Kasprzak: Programowanie zdarzeniowe 

13 - 2 

13.1 Przykłady obsługi zdarze

ń

  

Przykład  13.1

.  Aplet  zawiera  GUI  w  postaci  pojedynczego  przycisku 

wydaj

ą

cego d

ź

wi

ę

k dzwonka po klikni

ę

ciu mysz

ą

 w przycisk. 

Fragment kodu obsługi zdarze

ń

 dla przycisku:  

public class Beeper ... implements ActionListener { 
    ... 

    // w miejscu inicjalizacji:  

        button.addActionListener(this); 
    ... 
    public void actionPerformed(ActionEvent e) { 

        ...// Spowoduj dźwięk dzwonka... 

 

Toolkit.getDefaultToolkit().beep(); 

    } 

Komentarz: 
1)  Klasa  u

Ŝ

ytkownika 

Beeper

  implementuje  interfejs 

ActionListener

  –  jej 

jedyn

ą

 metod

ę

 

actionPerformed

.  

background image

13. Swing - obsługa zdarze

ń

 

W. Kasprzak: Programowanie zdarzeniowe 

13 - 3 

2) Obiekt klasy 

Beeper

 mo

Ŝ

e si

ę

 zarejestrowa

ć

 dla obsługi zdarze

ń

 akcji 

zgłaszanych przez przycisk – stosujemy w tym celu metod

ę

 klasy 

Button

 

addActionListener

3)  Teraz  metoda  klasy 

Beeper

  - 

actionPerformed 

–  jest  wywoływana  do 

obsługi zdarzenia przycisku. 
 

jednym  programie

  mo

Ŝ

e  zosta

ć

  zarejestrowana 

dowolna  liczba

 

obiektów

 dla obsługi ró

Ŝ

nych zdarze

ń

 zgłaszanych przez dowoln

ą

 liczb

ę

 

obiektów. 
 
Program  mo

Ŝ

e  posiada

ć

 

po  jednej  obsłudze

  dla  ka

Ŝ

dego  zdarzenia  (a 

nawet 

wi

ę

cej ni

Ŝ

 jedn

ą

 obsług

ę

 jednego zdarzenia).  

 
Z  drugiej  strony  program  mógłby  posiada

ć

 

jedn

ą

  obsług

ę

  wspóln

ą

  dla 

wszystkich zdarze

ń

.  

13. Swing - obsługa zdarze

ń

 

W. Kasprzak: Programowanie zdarzeniowe 

13 - 4 

Przykład 13.2. 

Aplet zawiera dwa 

ź

ródła zdarze

ń

 (obiekty klasy 

JButton

) i dwa obiekty 

obsługi  zdarze

ń

.  Pierwszy  obiekt  (pewnej  klasy 

MultiListener

)  obsługuje 

zdarzenia obu przycisków – obsługa polega na dodaniu tekstu – etykiety 
przycisku  -  w  górnym  obszarze  przycisku.  Drugi  obiekt  (pewnej  klasy 

Eavesdropper

)  obsługuje  jedynie  zdarzenia  jednego  przycisku  –  dodaje 

tekst – etykiet

ę

 przycisku - w dolnym polu tekstowym. 

 

Fragment kodu obsługi zdarze

ń

 dla przycisku:  

public class MultiListener ... implements ActionListener { 
    ... 

background image

13. Swing - obsługa zdarze

ń

 

W. Kasprzak: Programowanie zdarzeniowe 

13 - 5 

    // W miejscu inicjalizacji:  

        

button1.addActionListener(this);

 

// Pierwszy obiekt obsługujący 

        

button2.addActionListener(this); 

// Drugi obiekt obsługujący zdarzenie 

        

button2.addActionListener(new Eavesdropper(bottomTextArea)); 

    } 
 
    public void actionPerformed(ActionEvent e) { 
        topTextArea.append(e.getActionCommand() + newline); 
    } 

 
class Eavesdropper implements ActionListener { 
    ... 
    public void actionPerformed(ActionEvent e) { 
        myTextArea.append(e.getActionCommand() + newline); 
    } 

13. Swing - obsługa zdarze

ń

 

W. Kasprzak: Programowanie zdarzeniowe 

13 - 6 

Przykład 13.3 

Kolejny aplet ilustruje obsług

ę

 zdarzenia innego typu ni

Ŝ

 zdarzenia typu 

akcji – zdarzenia od myszy - click, press, release, enter, exit
Obsługa  zdarzenia  polega  na  wy

ś

wietleniu  w  polu  tekstowym  napisu 

odpowiadaj

ą

cego  rodzajowi  zdarzenia,  które  zaszło  nad  prostok

ą

tnym 

obszarem. 

 

Fragment kodu obsługi zdarze

ń

:  

public class MouseEventDemo ...  implements MouseListener { 
    ... 

    

// W miejscu inicjalizacji:  

        // Rejestracja dla zdarzeń myszy dla obszaru blankArea i apletu: 

        blankArea.addMouseListener(this); 
        addMouseListener(this); 

background image

13. Swing - obsługa zdarze

ń

 

W. Kasprzak: Programowanie zdarzeniowe 

13 - 7 

    } 
    public void mousePressed(MouseEvent e) { 
       saySomething("Mouse pressed; # of clicks: " 
                    + e.getClickCount(), e); 
    } 
    public void mouseReleased(MouseEvent e) { 
       saySomething("Mouse released; # of clicks: " 
                    + e.getClickCount(), e); 
    } 
    public void mouseEntered(MouseEvent e) { 
       saySomething("Mouse entered", e); 
    } 
    public void mouseExited(MouseEvent e) { 
       saySomething("Mouse exited", e); 
    } 
    public void mouseClicked(MouseEvent e) { 
       saySomething("Mouse clicked (# of clicks: " 
                    + e.getClickCount() + ")", e); 
    } 

13. Swing - obsługa zdarze

ń

 

W. Kasprzak: Programowanie zdarzeniowe 

13 - 8 

    void saySomething(String eventDescription, MouseEvent e) { 
        textArea.append(eventDescription + " detected on " 
                        + e.getComponent().getClass().getName() 
                        + "." + newline); 
    } 

background image

13. Swing - obsługa zdarze

ń

 

W. Kasprzak: Programowanie zdarzeniowe 

13 - 9 

13.2 Zasady tworzenia obsługi zdarze

ń

  

Przypomnijmy, 

Ŝ

e  obsługa  zdarze

ń

  i  malowanie  GUI  wykonywane  s

ą

 

przez jeden ten sam w

ą

tek. 

 

1) Obiekty generuj

ą

ce zdarzenia  

 

Ka

Ŝ

da  metoda  obsługi  zdarzenia  posiada  jeden 

argument.

  Jest  nim 

obiekt  klasy  pochodnej  od 

EventObject

.  Np.  dla  klas  zdarze

ń

  myszy 

istnieje klasa 

MouseEvent

 

Metoda klasy 

EventObject

Object getSource()  

zwraca obiekt, który zgłosił zdarzenie. 

 

Inne  klasy  argumentów  obsługi  zdarze

ń

  te

Ŝ

  posiadaj

ą

  metody 

zwracaj

ą

ce  obiekt,  w  którym  wystapiło  zdarzenie,  ale  o  specyficznym 

typie wyniku. Np. w klasie 

ComponentEvent

 istnieje metoda:  

    

Component getComponent

() 

13. Swing - obsługa zdarze

ń

 

W. Kasprzak: Programowanie zdarzeniowe 

13 - 10 

która zwraca komponent a nie generalny obiekt. 
Metoda  obsługi  zdarzenia  zwykle  pobiera  informacje  o  zdarzeniu  od 
swojego  argumentu  -  obiektu  klasy  zdarzeniowej.  Np.  obiekt  klasy 

MouseEvent

 posiada  dane o tym, ile było klikni

ęć

, jakie klawisze myszy 

zostały wybrane itd. 
 

2) Zdarzenia nisko-poziomowe a zdarzenia semantyczne 

 

Zdarzenia  niskiego  poziomu 

reprezentuj

ą

  zjawiska  generowane  przez 

system zarz

ą

dzania oknami lub wprowadzanie danych. S

ą

 nimi: 

 

zdarzenia  myszy  lub  klawiatury

  (s

ą

  bezpo

ś

rednio  wynikiem 

wprowadzania danych przez u

Ŝ

ytkownika),  

 

zdarzenia 

komponentu

 

(nadzorowanie 

pozycji, 

rozmiaru, 

widoczno

ś

ci),  

 

zdarzenia kontenera

 (gdy dodawany/usuwany jest komponent),  

 

uzyskiwanie/utrata kontekstu

 klawiatury przez komponent,  

 

zdarzenia okna

 (nadzoruj

ą

 stan okna dla komponentu). 

 

background image

13. Swing - obsługa zdarze

ń

 

W. Kasprzak: Programowanie zdarzeniowe 

13 - 11 

Pozostałe  zjawiska  generuj

ą

 

zdarzenia  semantyczne.  S

ą

  nimi 

zdarzenia typu: 

 “

action 

event”, 

 “

item

 event”,  

 “

list selection

 event”.  

 
Sposób  wywołania  semantycznego  zdarzenia  zale

Ŝ

y  od  komponentu. 

Np. przycisk zgłasza “action event”, gdy u

Ŝ

ytkownik klika w niego, a pole 

tekstowe zgłasza “action event”, gdy u

Ŝ

ytkownik wciska klawisz Return.  

 
Zdarzenie te zale

Ŝą

 równie

Ŝ

 od 

ś

rodowiska “look and feel”.  

 

Preferowa

ć

  nale

Ŝ

y  obsług

ę

  zdarze

ń

  semantycznych,  gdy

Ŝ

  kod  obsługi 

b

ę

dzie ogólniejszy i przenaszalny.  

Np.  obsługa  “action  events”  dla  przycisku  zapewni  reakcj

ę

  zarówno 

wtedy,  gdy  przycisk  wybierany  jest  mysz

ą

  lub  klawiatur

ą

,  podczas  gdy 

obsługa zdarze

ń

 myszy dla przycisku nie uwzgl

ę

dni klawiatury. 

13. Swing - obsługa zdarze

ń

 

W. Kasprzak: Programowanie zdarzeniowe 

13 - 12 

3) Adaptery i klasy wewn

ę

trzne w obsłudze zdarze

ń

  

 

Wi

ę

kszo

ść

  interfejsów  deklaruje  wi

ę

cej  ni

Ŝ

  jedn

ą

  metod

ę

.  Np. 

MouseListener

 deklaruje 5 metod:  

mousePressed, 

mouseReleased, 

mouseEntered, 

mouseExited, 

mouseClicked

.  

Nawet  wtedy,  gdy  nie  obsługujemy  niektórych  zdarze

ń

  myszy  musimy 

zaimplementowa

ć

 wszystkie metody implementowanego interfejsu.  

Przykład 13.4.a 

// Przykład kodu o niskiej czytelno

ś

ci: 

public class MojaKlasa implements MouseListener { 
    ... 
 

mojObiekt.addMouseListener(this); 

    ... 

    /* Pusta definicja metody  */ 

    public void mousePressed(MouseEvent e) { 
    } 

    /* Pusta definicja metody  */ 

    public void mouseReleased(MouseEvent e) { 

background image

13. Swing - obsługa zdarze

ń

 

W. Kasprzak: Programowanie zdarzeniowe 

13 - 13 

    } 

    /* Pusta definicja metody  */ 

    public void mouseEntered(MouseEvent e) { 
    } 

    /* Pusta definicja metody  */ 

    public void mouseExited(MouseEvent e) { 
    } 
    public void mouseClicked(MouseEvent e) { 

 

...// Implementacja obsługi zdarzenia... 

    } 

Istnienie  wielu  pustych  definicji  metod  zmniejsza  czytelno

ść

  kodu. 

Mo

Ŝ

na  zastosowa

ć

 

adaptery  klas

  z  API,  implementuj

ą

ce  interfejsy  o 

wi

ę

cej ni

Ŝ

 jednej metodzie. Zawieraj

ą

 one metody o 

pustym kodzie

Np. klasa 

MouseAdapter

 implementuje interfejs 

MouseListener

.  

Korzystanie z klasy adapteru

 polega na dziedziczeniu z niej. 

13. Swing - obsługa zdarze

ń

 

W. Kasprzak: Programowanie zdarzeniowe 

13 - 14 

Przykład 

13.4.b

 

Dziedziczenie 

klasy 

adapteru

 

zamiast 

implementowania interfejsu. Definiujemy tylko 1 metod

ę

 interfejsu. 

public class MojaKlasa extends MouseAdapter { 
    ...  
 

mojObiekt.addMouseListener(this); 

    ...  
    public void mouseClicked(MouseEvent e) { 

 

...// Obsługa zdarzenia w tym miejscu... 

    } 

 
W  przypadku 

apletów

  klasa  u

Ŝ

ytkownika  musi  dziedziczy

ć

  z  bazowej 

klasy  apletu  a  nie  z  adapteru  interfejsu.  W  takiej  sytuacji  mo

Ŝ

na 

skorzysta

ć

 z 

klasy wewn

ę

trznej

, która dziedziczy po klasie adapteru, np. 

po 

MouseAdapter

 

background image

13. Swing - obsługa zdarze

ń

 

W. Kasprzak: Programowanie zdarzeniowe 

13 - 15 

Przykład 13.4.c 

Klasa wewn

ę

trzna

 dziedziczy z klasy adapteru. 

public class MojaKlasa extends Applet { 
    ... 
 

mojObiekt.addMouseListener(new MyAdapter()); 

    ... 
    class MyAdapter extends MouseAdapter { 
        public void mouseClicked(MouseEvent e) {

 

 

    ...// Tu podamy kod obsługi zdarzenia ... 

        } 
    } 

 

Przykład 13.4.d

 Korzystanie z 

anonimowej klasy wewn

ę

trznej

public class MojaKlasa extends Applet 
    ... 
 

mojObiekt.addMouseListener(new MouseAdapter() { 

            public void mouseClicked(MouseEvent e) { 
 

    ...// Tu podamy kod obsługi zdarzenia ... 

13. Swing - obsługa zdarze

ń

 

W. Kasprzak: Programowanie zdarzeniowe 

13 - 16 

            } 
 

}); 

    ... 
    } 

 
Klasa  wewn

ę

trzna  (o  ile  nie  jest  statyczna)  mo

Ŝ

e  korzysta

ć

  nawet  z 

prywatnych  pól  i  metod  klasy  obejmuj

ą

cej.  Do  obiektu  obejmuj

ą

cego 

mo

Ŝ

na odwoła

ć

 si

ę

 przez: 

klasaObejmująca.this 

 

background image

13. Swing - obsługa zdarze

ń

 

W. Kasprzak: Programowanie zdarzeniowe 

13 - 17 

13.3 Typy zdarze

ń

 dla komponentów Swing 

Typy  zdarze

ń

  generowanych  przez  dany  komponent  wynikaj

ą

  z  typów 

“event listeners” u których mo

Ŝ

na zarejestrowa

ć

 swoje obiekty obsługi. 

Np. klasa 

Component 

definiuje nast

ę

puj

ą

ce metody rejestracji obiektów: 

addComponentListener , 
addFocusListener , 
addKeyListener , 
addMouseListener , 
addMouseMotionListener . 

Konkretny  komponent  generuje  tylko  te  zdarzenia,  dla  których  istniej

ą

 

rejestracje obiektów obsługi zdarze

ń

 

1) Typy zdarze

ń

 wyst

ę

puj

ą

ce we wszystkich komponentach Swinga 

Komponenty 

Swing

-a dziedzicz

ą

 z 

klasy 

Component

 w AWT

, dlatego te

Ŝ

 

wyst

ę

puj

ą

 w nich zdarzenia poni

Ŝ

szych 5 typów: 

component listener,  focus listener,  
key listenermouse eventsmouse-motion events . 

13. Swing - obsługa zdarze

ń

 

W. Kasprzak: Programowanie zdarzeniowe 

13 - 18 

Wszystkie komponenty 

Swing-a

 dziedzicz

ą

 te

Ŝ

 z klasy 

Container

 w AWT

chocia

Ŝ

 wi

ę

kszo

ść

 z nich nie pełni roli kontenera. Ale ka

Ŝ

dy komponent 

Swing-a  mo

Ŝ

e  (teoretycznie)  generowa

ć

  zdarzenia 

typowe  dla 

kontenera

,  tzn.  zdarzenia  powiadamiaj

ą

ce  o  dodaniu  lub  usuni

ę

ciu 

komponentu do/z kontenera.  
W  praktyce  tylko 

kontenery

  (takie  jak  panele  i  ramki)  i 

komponenty 

zło

Ŝ

one

 (jak lista wysuwnych opcji) generuj

ą

 zdarzenia dla kontenera. 

 

Klasa 

JComponent

 

posiada dalsze trzy typy obsługi zdarze

ń



 “

AncestorListener

”  –  obiekt  obsługi  jest  powiadamiany,  gdy  dodawani 

lub  usuwani  s

ą

  z  hierarchii  zawarto

ś

ci  przodkowie  komponentu,  a 

tak

Ŝ

e gdy staj

ą

 si

ę

 oni widoczni, s

ą

 ukrywani lub przesuwani. 



 “

PropertyChangeListener

”  –  obiekt  obsługi  jest  powiadamiany  o 

zmianach  w  ustawionych  na  trwałe  własno

ś

ciach  komponentu  (tzw. 

„bound properties”). 



 “

VetoableChangeListener

”  –  obiekt  obsługi  jest  powiadamiany  o 

zmianach własno

ś

ci o zadanych ograniczeniach. 

background image

13. Swing - obsługa zdarze

ń

 

W. Kasprzak: Programowanie zdarzeniowe 

13 - 19 

2) Inne typy obsługi zdarze

ń

 w komponentach Swinga 

ActionListener 
ChangeListener 
CaretListener 
DocumentListener 
UndoableEditListener 
ItemListener 
WindowListener 
ListSelection 

i szereg indywidualnych. 

13. Swing - obsługa zdarze

ń

 

W. Kasprzak: Programowanie zdarzeniowe 

13 - 20 

13.4 Implementowanie obsługi wybranych zdarze

ń

  

1) Zdarzenia akcji (Action Listener)  

Zdarzenie typu “action event” powstanie np. wtedy, gdy u

Ŝ

ytkownik w UI 

kliknie  przycisk, wybierze opcj

ę

  menu lub  przyci

ś

nie  klawisz 

Return

 dla 

pola 

tekstowego. 

jego 

wyniku 

do 

wszystkich 

obiektów 

zarejestrowanych  na  wła

ś

ciwym  komponencie  zostanie  rozesłane 

wywołanie metody 

actionPerformed

Interfejs 

ActionListener

 posiada tylko jedn

ą

 metod

ę

void actionPerformed(ActionEvent)  

Parametrem  metody

  jest  obiekt  klasy 

ActionEvent

.  W  tej  klasie 

zdefiniowano m.in. dwie po

Ŝ

yteczne metody: 

String getActionCommand()  

Metoda zwraca napis rozkazu zwi

ą

zany z akcj

ą

. Wi

ę

kszo

ść

 klas, których 

obiekty mog

ą

 generowa

ć

 zdarzenie typu akcji posiada metod

ę

  

setActionCommand  

umo

Ŝ

liwiaj

ą

c

ą

 ustalenie tego napisu rozkazu. 

Je

ś

li ten napis nie jest ustalony to rozkaz zwi

ą

zany z akcj

ą

 jest tekstem 

background image

13. Swing - obsługa zdarze

ń

 

W. Kasprzak: Programowanie zdarzeniowe 

13 - 21 

wy

ś

wietlanym w komponencie. 

Jesli  obiekt  posiada  wiele  obiektów  opcji,  czyli  wiele  mo

Ŝ

liwych  akcji, 

które  mog

ą

  zosta

ć

  wykonane,  to  zwykle  napis  rozkazu  odpowiada 

nazwie wybranej opcji. 
 

int getModifiers()  

Metoda  zwraca  warto

ść

  całkowit

ą

  okre

ś

laj

ą

c

ą

  jaki  klawisz  specjalny 

został przyci

ś

ni

ę

ty przez u

Ŝ

ytkownika podczas generacji zdarzenia typu 

akcja. Mo

Ŝ

liwy wynik to stałe zdefiniowane w 

ActionEvent: 

SHIFT_MASK, CTRL_MASK, META_MASK, ALT_MASK

 . 

Np.  
gdy u

Ŝ

ytkownik skorzystał z przycisku 

Shift

 dla wyboru opcji to poni

Ŝ

sze 

wyra

Ŝ

enie b

ę

dzie prawdziwe: 

actionEvent.getModifiers() & ActionEvent.SHIFT_MASK 

     

13. Swing - obsługa zdarze

ń

 

W. Kasprzak: Programowanie zdarzeniowe 

13 - 22 

2) Zdarzenia zmiany stanu (Change Listener)  

Zdarzenie  typu  “zmiana”  wyst

ą

pi  wtedy,  gdy 

dany  komponent  zmienia 

stan

.  

Np.  

 

Przycisk

  generuje  takie  zdarzenie  za  ka

Ŝ

dym  razem  gdy  zostanie 

przyci

ś

ni

ę

ty.  Domy

ś

lna  obsługa  tego  zdarzenia  dla  przycisku  jest 

zapewniona  przez 

ś

rodowisko  „look-and-feel”  (np.  od

ś

wie

Ŝ

enie 

wygl

ą

du). 

 Zdarzenie typu “zmiana” umo

Ŝ

liwia podstawow

ą

 funkcjonalno

ść

 dwóch 

komponentów  Swinga: 

suwaka

  i  „

wyboru  kolorów

”.  Zdarzenie 

generowane  jest  wtedy,  gdy  zmienia  sie  warto

ś

c  suwaka  wzgl.  gdy 

u

Ŝ

ytkownik wybiera nowy kolor. 

 

Przykład 13.5

. Obsługa zdarzenia typu “zmiana” dla suwaka. 

//...w miejscu inicjalizacji  

framesPerSecond.addChangeListener(new SliderListener()); 
... 
class SliderListener implements ChangeListener { 

background image

13. Swing - obsługa zdarze

ń

 

W. Kasprzak: Programowanie zdarzeniowe 

13 - 23 

    public void stateChanged(ChangeEvent e) { 
        JSlider source = (JSlider)e.getSource(); 
        if (!source.getValueIsAdjusting()) { 
            int fps = (int)source.getValue(); 
 

    ... 

        }     
    } 

 
Interfejs 

ChangeListener

 deklaruje tylko jedn

ą

 metod

ę

void stateChanged(ChangeEvent)  

Parametr metody jest typu 

ChangeEvent

. Wła

ś

ciw

ą

 metod

ą

 dla pobrania 

komponentu, 

który 

zgłosił 

zdarzenie 

jest 

metoda 

getSource

 

odziedziczona po klasie 

EventObject

.  

Klasa 

ChangeEvent

 nie definiuje dodatkowych metod. 

13. Swing - obsługa zdarze

ń

 

W. Kasprzak: Programowanie zdarzeniowe 

13 - 24 

3) Zdarzenia komponentu (Component Listener)  

Zdarzenia  typu  “component  event”  s

ą

  generowane  przez  komponent 

wtedy, gdy zostanie on: 

 

ukryty 

(metoda obsługi - 

componentHidden

)  

 

uczyniony widocznym 

(metoda obsługi – 

componentShown

),  

 

przesuni

ę

ty

 (metoda obsługi – 

componentMoved

) lub nast

ą

pi  

 

zmiana jego rozmiaru

 (metod obsługi 

componentResized

). 

 

Obsługa  tych  zdarze

ń

  jest  potrzebna  obiektom,  które 

zapewniaj

ą

 

informacj

ę

  o  komponencie

,  ale  nie  jest  potrzebna  dla  zarz

ą

dzania 

widokiem lub dla malowania komponentu.  
Zdarzenia  generowane  przy  ukrywaniu  lub  nadaniu  widoczno

ś

ci 

komponentowi  s

ą

  wynikiem  wywoła

ń

  metody  klasy 

Component

setVisible

 (lub metod 

show, hide

).  

 

Uwaga:

  proces  ikonizacji  okna  nie  powoduje  zdarzenia  ukrycia 

komponentu  lecz  zdarzenia  nale

Ŝą

cego  do  zdarze

ń

  okna  („window 

event”). 

background image

13. Swing - obsługa zdarze

ń

 

W. Kasprzak: Programowanie zdarzeniowe 

13 - 25 

Przykład 13.6.  

Aplet 

ComponentEventDemo

 zawiera przycisk „

Start playing ...”

 powoduj

ą

cy 

wyswietlenie 

okna ramki 

(typu 

JFrame

). W ramce jest 

panel

 posiadaj

ą

cy 

etykiet

ę

 i 

pole wyboru

 („checkbox”) nadzoruj

ą

ce widoczno

ść

 etykiety. 

Dla  celów  kontrolnych  istnieje  te

Ŝ

 

pole  tekstowe

  wy

ś

wietlaj

ą

ce 

komunikaty 

dla 

ka

Ŝ

dego 

zdarzenia 

typu 

component 

event

” 

wygenerowanego przez 

okno, panel, etykiet

ę

 lub pole wyboru

 

Fragment GUI apletu zawieraj

ą

cy: 

- przycisk „Start playing”, 
- pole tekstowe z komunikatami, 
-  przycisk  zerowania  pola  tekstowego 
„Clear” 

 

Opuszczenie 

strony apletu

 powoduje 

ukrycie okna 

(

componentHidden

), a 

jego  ponowne 

pojawienie

  (

componentShown

)  nast

ę

puje  po  powrocie  do 

strony apletu. 

public class ComponentEventDemo ... implements ComponentListener { 
    ... 

13. Swing - obsługa zdarze

ń

 

W. Kasprzak: Programowanie zdarzeniowe 

13 - 26 

    // W miejscu inicjalizacji : 

        aFrame = new JFrame("A Frame"); 
        ComponentPanel p = new ComponentPanel(this); 
        aFrame.addComponentListener(this); 
        p.addComponentListener(this); 
    ... 
    public void componentHidden(ComponentEvent e) { 
 

displayMessage("componentHidden event from " 

 

 

       + e.getComponent().getClass().getName()); 

// Pobiera nazwę klasy  

// obiektu zgłaszającego zdarzenie 

    } 
    public void componentMoved(ComponentEvent e) { 
 

displayMessage("componentMoved event from " 

 

 

       + e.getComponent().getClass().getName()); 

    } 
    public void componentResized(ComponentEvent e) { 
 

displayMessage("componentResized event from " 

 

 

       + e.getComponent().getClass().getName()); 

    } 

background image

13. Swing - obsługa zdarze

ń

 

W. Kasprzak: Programowanie zdarzeniowe 

13 - 27 

    public void componentShown(ComponentEvent e) { 
 

displayMessage("componentShown event from " 

 

 

       + e.getComponent().getClass().getName()); 

    } 
}

 // Koniec definicji klasy głównej 

class ComponentPanel extends JPanel ... { 
    ... 
    ComponentPanel(ComponentEventDemo listener) { 

        ...// Po utworzeniu etykiety i pola wyboru : 

        label.addComponentListener(listener); 
        checkbox.addComponentListener(listener); 
    } 
    ... 

 
Interfejs 

ComponentListener

  i  odpowiadaj

ą

ca  mu  klasa  adaptera 

ComponentAdapter

 deklaruj

ą

 cztery metody: 

void componentHidden(ComponentEvent)  

Metoda wołana po ukryciu komponentu wywołaniem setVisible(false). 

13. Swing - obsługa zdarze

ń

 

W. Kasprzak: Programowanie zdarzeniowe 

13 - 28 

 

void componentMoved(ComponentEvent)  

Metoda wołana po przesuni

ę

ciu komponentu wzgl

ę

dem jego kontenera. 

 

void componentResized(ComponentEvent)  

Metoda  wołana  po  zmianie  rozmiaru  komponentu  (prostok

ą

ta 

obejmuj

ą

cego go). 

 

void componentShown(ComponentEvent)  

Metoda  wołana  po  nadaniu  widoczno

ś

ci  komponentowi  wywołaniem 

setVisible(true). 
 
Ka

Ŝ

da z powy

Ŝ

szych metod posiada parametr typu 

ComponentEvent

. W 

tej klasie zdefiniowano po

Ŝ

yteczn

ą

 metod

ę

Component getComponent() , 

- zwraca komponent, który wygerenował zdarzenie. 

background image

13. Swing - obsługa zdarze

ń

 

W. Kasprzak: Programowanie zdarzeniowe 

13 - 29 

4) Zdarzenia kontenera (Container Listener)  

Zdarzenia typu “container events” s

ą

 generowane przez kontener zaraz 

po  tym,  jak 

dodany 

zostanie 

do  niego  komponent

  lub  komponent 

zostanie 

z niego

 

usuni

ę

ty

.  

Te zdarzenia słu

Ŝą

 

jedynie powiadamianiu 

a nie maj

ą

 wpływu na samo 

wykonanie operacji dodania lub usuni

ę

cia komponentu. 

 

Przykład 13.7.

  

Aplet 

ContainerEventDemo

 

posiada  w  swoim  GUI  przyciski  o  nazwach: 

Add  a  button

”  i  “

Remove  a  button

,  które  umo

Ŝ

liwiaj

ą

  dodanie  lub 

usuni

ę

cie komponentu do/z panelu poło

Ŝ

onego na dole obszaru apletu. 

Ka

Ŝ

da  taka  operacja  spowoduje  wygenerowanie  przez  panel  zdarzenia 

typu  „

container  event

”  i  powiadomienie  o  tym  metod  obsługi  tego 

zdarzenia  dla  panelu 

componentAdded()

  lub 

componentRemoved()

.  W 

wyniku obsługi wy

ś

wietlany jest w górnej cz

ęś

ci apletu tekst informuj

ą

cy 

o zdarzeniu. 
 

13. Swing - obsługa zdarze

ń

 

W. Kasprzak: Programowanie zdarzeniowe 

13 - 30 

 

 

public class ContainerEventDemo ... implements ContainerListener ... { 

    ...// W kodzie inicjalizacji : 

 

buttonPanel = new JPanel(); 

 

buttonPanel.addContainerListener(this); 

    ... 
    public void componentAdded(ContainerEvent e) { 
 

displayMessage(" added to ", e); 

    } 
    public void componentRemoved(ContainerEvent e) { 

background image

13. Swing - obsługa zdarze

ń

 

W. Kasprzak: Programowanie zdarzeniowe 

13 - 31 

 

displayMessage(" removed from ", e); 

    } 
    void displayMessage(String action, ContainerEvent e) { 
 

display.append(((JButton)e.getChild()).getText() 

 

 

       + " was" 

 

 

       + action    

// Parametr zawiera nazwę operacji – dodano/usnięto 

 

 

       + e.getContainer().getClass().getName() 

// Pobierz nazwę klasy  

// kontenera, który spowodował zdarzenie 

 

 

       + newline); 

    } 
    ... 

 

Interfejs 

ContainerListener

  i  jego  klasa  adapteru 

ContainerAdapter 

deklaruj

ą

 dwie metody: 

void componentAdded(ContainerEvent)

  

- metoda wołana po podaniu komponentu do kontenera.  

void componentRemoved(ContainerEvent) 

 

- metoda wołana po usuni

ę

ciu komponentu z kontenera.  

13. Swing - obsługa zdarze

ń

 

W. Kasprzak: Programowanie zdarzeniowe 

13 - 32 

 
Parametr  obu  metod  jest  typu 

ContainerEvent

  –  w  tej  klasie 

zdefiniowano dwie po

Ŝ

yteczne metody: 

Component getChild()  

–  metoda  zwraca  komponent,  którego  dodanie  wzgl.  usuni

ę

cie 

spowodowało generacj

ę

 zdarzenia. 

Container getContainer()  

- metoda zwraca kontener, który zgłosił zdarzenie. 
 

background image

13. Swing - obsługa zdarze

ń

 

W. Kasprzak: Programowanie zdarzeniowe 

13 - 33 

5) Zdarzenia okna (Window Listener)  

Zdarzenia typu 

zdarzenia okna 

(“window events”) generowane s

ą

 przez 

okna  (typu  ramka  lub  dialog)  zaraz  po  tym,  jak  okno  zostanie 

otwarte, 

zamkni

ę

te

zminimalizowane,  przywrócone,  uczynione  aktywnym 

lub

 

nieaktywnym

-

 

Otwarcie okna 

oznacza pierwsze namalowanie okna. 

-

 

Zamkni

ę

cie okna

 oznacza usuni

ę

cie go z ekranu. 

-

 

Minimalizacja okna 

oznacza zast

ą

pienie go mał

ą

 ikonk

ą

 na pulpicie. 

-

 

Przywrócenie okna 

to operacja odwrotna do minimalizacji. 

-

 

Aktywacja okna

 oznacza, 

Ŝ

e okno lub zawarty w nim komponent mog

ą

 

przyjmowa

ć

 zdarzenia myszy lub klawiatury. 

-

 

Okno

  staje  sie 

nieaktywne,

  gdy  okno  i  zawarte  w  nim  komponenty 

trac

ą

 mo

Ŝ

liwo

ść

 przyjmowania zdarze

ń

 myszy i klawiatury. 

Uwaga 

Zdarzenia polegaj

ą

ce na uczynieniu okna 

widocznym

 (show, visible) lub 

na 

ukryciu  go

  (hide)  zaliczane  s

ą

  do  typu 

zdarze

ń

  komponentu

 

(„component events”).  

13. Swing - obsługa zdarze

ń

 

W. Kasprzak: Programowanie zdarzeniowe 

13 - 34 

Obsługa zdarzenia zamykania okna 

Zdarzenie 

zamykania  okna 

(w  wyniku  operacji 

Close

)  jest  głównym 

zdarzeniem zwi

ą

zanym z oknem wymagaj

ą

cym obsługi. 

Istnieje 

domy

ś

lna obsługa 

zdarzenia zamykania okna polegaj

ą

ca jedynie 

na 

ukryciu go

 (uczynieniu go niewidocznym).  

Mo

Ŝ

na ustawi

ć

 

inny predefiniowany sposób obsługi tego zdarzenia

 przez 

domy

ś

ln

ą

  procedur

ę

  obsługi  zdarze

ń

  okna  –  np.  usuni

ę

cie  zasobów 

okna  –  stosuj

ą

c  metod

ę

  klas 

JFrame

  lub 

JDialog

  o  nazwie 

setDefaultCloseOperation

 
Mo

Ŝ

emy  te

Ŝ

 

zaimplementowa

ć

  własn

ą

  metod

ę

  obsługi

  tego  zdarzenia, 

np.  w  celu  zapami

ę

tania  danych  zwi

ą

zanych  z  oknem  przed  jego 

usuni

ę

ciem lub zako

ń

czenie programu, gdy ostatnie jego okno zostanie 

zamkni

ę

te.  

Je

ś

li  implementujemy  własn

ą

 

procedur

ę

  obsługi  zdarzenia  zamykania 

okna to mo

Ŝ

emy „

wył

ą

czy

ć

” domy

ś

ln

ą

 

procedur

ę

 obsługi wywołuj

ą

c: 

setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE)

background image

13. Swing - obsługa zdarze

ń

 

W. Kasprzak: Programowanie zdarzeniowe 

13 - 35 

Obsługa zdarze

ń

 minimalizacji i przywracania okna 

Cz

ę

stym  celem  zada

ń

  obsługi  zdarze

ń

  dla  okna  jest 

zatrzymywanie 

w

ą

tków

  i 

zwalnianie  zasobów

  wtedy,  gdy  okno 

jest  minimalizowane

,  a 

nast

ę

pnie 

ponowne ich restartowanie

, gdy okno 

jest przywracane

.  

Pozwala  to  unikn

ąć

  niepotrzebnego  zajmowania  procesora  lub  innych 

zasobów  przez  w

ą

tki.  Np.  okno  zawiera  animacj

ę

  –  po  minimalizacji 

okna  nale

Ŝ

y  zatrzyma

ć

  w

ą

tek  animacji  i  zwolni

ć

  du

Ŝ

e  bufory,  a  po 

przywróceniu okna zrestartowa

ć

 w

ą

tek po przywróceniu buforów. 

 

Przykład 13.8.

 Aplet 

WindowEventDemo

 posiada w górnej cz

ęś

ci swojego 

GUI przycisk otwieraj

ą

cy małe okno. Klasa główna „nasłuchuje” zdarze

ń

 

generowanych  przez  to  okno  i  wy

ś

wietla  napisy  wła

ś

ciwe  dla  typu 

zdarzenia. 
Je

ś

li  wył

ą

czymy  domy

ś

ln

ą

  obsług

ę

  zdarzenia  zamykania  okna  to 

zdarzenie  “window  closed”  nie  zajdzie,  gdy

Ŝ

  nasza  obsługa  zdarzenia 

window  closing”  polega  jedynie  na  wywołaniu 

setVisible(false)

  (ukryciu 

okna) zamiast wykonania zwolnienia zasobów obiektu metod

ą

 

dispose()

.  

13. Swing - obsługa zdarze

ń

 

W. Kasprzak: Programowanie zdarzeniowe 

13 - 36 

 

 

public class WindowEventDemo ... implements WindowListener { 

     ...//w kodzie inicjalizacji: 

        // Utwórz ale nie wy

ś

wietlaj okna 

        

window = new JFrame("Okno WindowEventDemo"); 

        window.addWindowListener(this); 

// Rejestracja obsługi zdarzeń okna 

        window.getContentPane().add
 

    new JLabel("Demonstracja zdarzeń okna "), BorderLayout.CENTER); 

        window.pack(); 
    } 
    public void windowClosing(WindowEvent e) { 
        window.setVisible(false); 
        displayMessage("Window closing", e); 

background image

13. Swing - obsługa zdarze

ń

 

W. Kasprzak: Programowanie zdarzeniowe 

13 - 37 

    } 
    public void windowClosed(WindowEvent e) { 
        displayMessage("Window closed", e); 
    } 
    public void windowOpened(WindowEvent e) { 
        displayMessage("Window opened", e); 
    } 
    public void windowIconified(WindowEvent e) { 
        displayMessage("Window iconified", e); 
    } 
    public void windowDeiconified(WindowEvent e) { 
        displayMessage("Window deiconified", e); 
    } 
    public void windowActivated(WindowEvent e) { 
        displayMessage("Window activated", e); 
    } 
    public void windowDeactivated(WindowEvent e) { 
        displayMessage("Window deactivated", e); 
    } 

13. Swing - obsługa zdarze

ń

 

W. Kasprzak: Programowanie zdarzeniowe 

13 - 38 

    void displayMessage(String prefix, WindowEvent e) { 
        display.append(prefix 
                       + ": " 
                       + e.getWindow() 

// Pobierz okno, które wygenerowało zdarzenie 

                       + newline);  
    } 
    ... 

 
Interfejs 

WindowListener

  i  klasa  adaptera 

WindowAdapter

  deklaruj

ą

 

metody: 

void windowOpened(WindowEvent)

  

– metoda wołana wtedy, gdy nadzorowane okno zostało namalowane po 
raz pierwszy. 

 

void windowClosing(WindowEvent) 

  

-  metoda  wołana  po 

Ŝą

daniu  u

Ŝ

ytkownika  aby  zamkn

ąć

  okno  – 

procedura obsługi powinna usun

ąć

 zasoby okna lub ukry

ć

 okno metod

ą

 

background image

13. Swing - obsługa zdarze

ń

 

W. Kasprzak: Programowanie zdarzeniowe 

13 - 39 

setVisible(false)

.  

 

void windowClosed(WindowEvent)

  

– metoda wołana po zamkni

ę

ciu nadzorowanego okna. 

 

void windowIconified(WindowEvent)  
void windowDeiconified(WindowEvent)

 

- metody wołane po minimalizacji 

wzgl. przywróceniu nadzorowanego okna. 

 

void windowActivated(WindowEvent)  
void  windowDeactivated(WindowEvent)

 

-  metody  wołane  po  uczynieniu 

aktywnym wzgl. nieaktywnym nadzorowanego okna. 
 
Ka

Ŝ

da  z  powy

Ŝ

szych  metod  posiada  parametr  typu 

WindowEvent

Metoda  

Window getWindow()  

- pobiera i zwraca okno, które wygenerowało to zdarzenie. 

13. Swing - obsługa zdarze

ń

 

W. Kasprzak: Programowanie zdarzeniowe 

13 - 40 

6) Zdarzenia wewn

ę

trznej ramki (Internal Frame Listener)  

Zdarzenia  typu  “internal  frame  events”  pełni

ą

  podobn

ą

  rol

ę

  dla  klasy 

JInternalFrame

 co zdarzenia typu “window events” dla klasy 

JFrame

Umo

Ŝ

liwiaj

ą

  one  powiadomienie  obiektów  obsługi  o  tym, 

Ŝ

e  "okno" 

zostało 

pokazane  po  raz  pierwszy,  ma  by

ć

  usuni

ę

te,  zminimalizowane, 

przywrócone, uczynione aktywnym 

lub 

nieaktywnym

 

Przykład 13.9.

  

Aplikacja 

InternalFrameEventDemo

 

po 

przyci

ś

ni

ę

ciu 

jej 

górnego 

przycisku  wy

ś

wietla  wewn

ę

trzn

ą

 

ramk

ę

 

nasłuchuje 

zdarze

ń

 

generowanych  przez  t

ę

  ramk

ę

Obsługa 

zdarze

ń

 

polega 

na 

wy

ś

wietleniu  informacji  o  typie 

wygenerowanego zdarzenia.  
 

 

background image

13. Swing - obsługa zdarze

ń

 

W. Kasprzak: Programowanie zdarzeniowe 

13 - 41 

 

public class InternalFrameEventDemo ... 
 

 

     implements InternalFrameListener ... { 

    ... 

// Metoda tworząca wewnętrzną ramkę, której zdarzeń nasłuchujemy 

    protected void createListenedToWindow() { 
 

listenedToWindow new JInternalFrame("Event Generator", 

 

 

 

 

 

      true,

  

// zmienność rozmiaru 

 

 

 

 

 

      

true,

  

// zamykalne

 

 

 

 

 

 

      true,

  

// maksymalizowalne

 

 

 

 

 

 

      true);

 

// ikonifikowalne 

 

listenedToWindow.setDefaultCloseOperation( /

/ Domyślne zamykanie 

 

 

 

 

WindowConstants.DISPOSE_ON_CLOSE); 

 

... 

    } 
    public void internalFrameClosing(InternalFrameEvent e) { 
 

displayMessage("Internal frame closing", e); 

    } 
    public void internalFrameClosed(InternalFrameEvent e) { 

13. Swing - obsługa zdarze

ń

 

W. Kasprzak: Programowanie zdarzeniowe 

13 - 42 

 

displayMessage("Internal frame closed", e); 

 

listenedToWindow = null;  

    } 
    public void internalFrameOpened(InternalFrameEvent e) { 
 

displayMessage("Internal frame opened", e); 

    } 
    public void internalFrameIconified(InternalFrameEvent e) { 
 

displayMessage("Internal frame iconified", e); 

    } 
    public void internalFrameDeiconified(InternalFrameEvent e) { 
 

displayMessage("Internal frame deiconified", e); 

    } 
    public void internalFrameActivated(InternalFrameEvent e) { 
 

displayMessage("Internal frame activated", e); 

    } 
    public void internalFrameDeactivated(InternalFrameEvent e) { 
 

displayMessage("Internal frame deactivated", e); 

    } 
    void displayMessage(String prefix, InternalFrameEvent e) { 

background image

13. Swing - obsługa zdarze

ń

 

W. Kasprzak: Programowanie zdarzeniowe 

13 - 43 

// Nasza metoda wyświetlania informacji o zdarzeniach 

 

String s = prefix + ": " + e.getSource(); 

// Pobierz obiekt-źródło zdarzenia 

 

display.append(s + newline); 

    } 
 
... 

// W klasie jest teŜ obsługa akcji dla przycisku „Show Internal Frame”  

    public void actionPerformed(ActionEvent e) { 
 

if (e.getActionCommand().equals(SHOW)) { 

 

    ... 

 

    if (listenedToWindow == null) { 

 

        createListenedToWindow();  

// Utwórz nową wewętrzną ramkę 

 

        listenedToWindow.addInternalFrameListener(this);

//Rejestruj w celu 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

// obsługi jej zdarzeń

 

 

        ... 

 

    } 

 

}  

 

... 

    } 

13. Swing - obsługa zdarze

ń

 

W. Kasprzak: Programowanie zdarzeniowe 

13 - 44 

 

interfejsie 

InternalFrameListener

 

klasie 

adaptera 

InternalFrameAdapter

 

zadeklarowano metody: 

 

void  internalFrameOpened(InternalFrameEvent)

 

-  wołana  po  pierwszym 

narysowaniu nadzorowanej wewn

ę

trznej ramki. 

 

void  internalFrameClosing(InternalFrameEvent)

 

–  metoda  wołana  po 

Ŝą

daniu u

Ŝ

ytkownika zamkni

ę

cia wewn

ę

trznej ramki. Domy

ś

lna obsługa 

w  klasie 

JInternalFrame

  jedynie  ukrywa  okno  dla  zdarzenia  zamykania 

ramki.  Metod

ą

  klasy 

JInternalFrame

  o  nazwie 

setDefaultCloseOperation

 

mo

Ŝ

na  zmieni

ć

  zachowanie  tej  obsługi  na: 

DISPOSE_ON_CLOSE

  lub 

DO_NOTHING_ON_CLOSE

  (stałe  w  interfejsie 

WindowConstants

implementowanym przez 

JInternalFrame

).  

 

void  internalFrameClosed(InternalFrameEvent)

 

-  wołana  zaraz  po 

usuni

ę

ciu obiektu i zasobów wewn

ę

trznej ramki metod

ą

 

dispose

background image

13. Swing - obsługa zdarze

ń

 

W. Kasprzak: Programowanie zdarzeniowe 

13 - 45 

 

void internalFrameIconified(InternalFrameEvent)  
void  internalFrameDeiconified(InternalFrameEvent)

 

– metody wołane s

ą

 

po minimalizacji wzgl. przwróceniu wewn

ę

trznej ramki. 

 

void internalFrameActivated(InternalFrameEvent)  
void internalFrameDeactivated(InternalFrameEvent)

 

– metody wołane s

ą

 

po uczynieniu ramki aktywnej wzgl. nieaktywnej. 

 

Ka

Ŝ

da  metoda  posiada  jeden  parametr  typu 

InternalFrameEvent

  -  ta 

klasa nie definuje u

Ŝ

ytecznych metod. Dziedziczy ona metod

ę

 

getSource

 

po  klasie 

EventObject

  co  pozwala  na  pobranie  obiektu  ramki,  który 

wygenerował obsługiwane zdarzenie.  

13. Swing - obsługa zdarze

ń

 

W. Kasprzak: Programowanie zdarzeniowe 

13 - 46 

7) Zdarzenia wyboru opcji (Item Listener)  

Zdarzenia  typu  “Item  events”  generowane  s

ą

  przez  komponenty 

implementuj

ą

ce  interfejs 

ItemSelectable

.  Takie  komponenty  zapewniaj

ą

 

dwustanow

ą

 reprezentacj

ę

 opcji (wł

ą

cz/wył

ą

cz). 

Np. w 

Swingu

 takie zdarzenia generuj

ą

 obiekty typu “

check box”, “check 

box menu item”, “combo box

 
Interfejs 

ItemListener 

deklaruje jedn

ą

 metod

ę

void itemStateChanged(ItemEvent)  

Metoda  jest  wołana  zaraz  po  zmianie  stanu  nadzorowanego 
komponentu.  Parametrem  metody  jest  obiekt  klasy 

ItemEvent

.  W  tej 

klasie zdefiniowano metody: 

Object getItem() 

 - 

zwraca obiekt zwi

ą

zany z opcj

ą

 o zmienionym stanie 

– cz

ę

sto jest to napis klasy 

String

 b

ę

d

ą

cy tytułem wybranej opcji. 

ItemSelectable 

getItemSelectable()

 

– 

zwraca 

komponent, 

który 

wygenerował zdarzenie. 

int  getStateChange()

  –  zwraca  nowy  stan  opcji  –  w  klasie 

ItemEvent

 

background image

13. Swing - obsługa zdarze

ń

 

W. Kasprzak: Programowanie zdarzeniowe 

13 - 47 

zdefiniowano dwa stany: 

SELECTED , DESELECTED

.  

 

Przykład  13.10

.  W  programie 

ComponentEventDemo

  (przykład  13.6) 

wyst

ę

puje te

Ŝ

 kod obsługi zdarze

ń

 wyboru opcji (“item events”): 

... 
// W kodzie inicjalizacji
 

checkbox.addItemListener(this); 

// Rejestracja dla zdarzeń wyboru opcji

 

... 
public void itemStateChanged(ItemEvent e) {  
    if (e.getStateChange() == ItemEvent.SELECTED) { 
        label.setVisible(true); 
        label.revalidate(); 
        label.repaint(); 
    } else 
        label.setVisible(false); 
    } 

13. Swing - obsługa zdarze

ń

 

W. Kasprzak: Programowanie zdarzeniowe 

13 - 48 

8) Zdarzenia dla klawiatury (Key Listener)  

Zdarzenia typu “key events” pojawiaj

ą

 si

ę

, gdy u

Ŝ

ytkownik 

przyciska

 lub 

zwalnia  klawisze  klawiatury

.  S

ą

  one  generowane  przez 

komponent

 

posiadaj

ą

cy w danej chwili 

kontekst klawiatury

.  

 

Zdarzenia klawiatury (“key events”): 

-

  “

key typed

” – wprowadzono znak w Unikodzie; 

-

  

key pressed

” - przyci

ś

ni

ę

cie klawisza; 

-

  

key released

” – zwolnienie klawisza. 

 

Najcz

ęś

ciej  program  obsługuje  tylko  zdarzenia  typu  “wprowadzono 

znak”.  Obsługa  dwóch  pozostałych  zdarze

ń

  potrzebna  jest  jedynie 

wtedy,  gdy  chcemy  reagowa

ć

  na  klawisze  nie  reprezentuj

ą

ce  znaków 

widocznych lecz tzw. znaki specjalne, np. 

F1

 
Uwaga:

  innym  mechanizmem  reakcji  programu  na  klawisze  specjalne 

jest stosowanie skrótów do klawiszy („key bindings”) w obiektach opcji. 

 

background image

13. Swing - obsługa zdarze

ń

 

W. Kasprzak: Programowanie zdarzeniowe 

13 - 49 

Proces uzyskiwania przez komponent kontekstu klawiatury: 

 metoda komponentu 

isFocusTraversable

 musi zwraca

ć

 

true

 komponent  wywołuje  metod

ę

 

requestFocus

  wtedy,  gdy  zostanie  on 

wybrany, np. klikni

ę

ciem myszy – w obsłudze zdarzenia myszy. 

 

Przykłady generacji zdarze

ń

 klawiaury: 

 Wprowadzenie znaku 'a' do pola tekstowego wygeneruje 3 zdarzenia: 

key  pressed”,  “key  typed”,  “key  released”.  Zdarzenie  “key  typed”  nie 
uzyskuje kodu klawisza ani kodu modyfikatora. 

 Wprowadzenie  klawisza  ‘Shift’  -  pole  tekstowe  generuje  2  zdarzenia: 

key pressed” i “key released”.  

  Wprowadzenie  znaku  'A'  jednoczesnym  (‘Shift’+A)  –  generuje 

zdarzenia:  “key  pressed”  (Shift),  “key  pressed”  (A),  “key  typed”  (A), 
“key released” (A), “key released” (Shift). 

  Wrowadzenie  znaku  'A'  sekwencj

ą

  (‘Caps  Lock’,  A)  –  generuje 

zdarzenia:  “key  pressed”  (Caps  Lock),  “key  pressed”  (A),  “key  typed” 
('A'), key released (A).  

13. Swing - obsługa zdarze

ń

 

W. Kasprzak: Programowanie zdarzeniowe 

13 - 50 

Uwaga

:  dla  klawisza  “Caps  Lock”  i  innych  klawiszy  “stanu”  (Scroll 

Lock,  Num  Lock)  zdarzenie  „key  released”  generowane  jest  dla 
nast

ę

pnej pary akcji – wcisni

ę

cia i zwolnienia tego klawisza.  

 

Przykład 13.11.

 GUI apletu składa si

ę

 z edytowalnego pola tekstowego 

w  którym  u

Ŝ

ytkownik  wprowadza  znaki  z  klawiatury  i  z  obszaru 

tekstowego wy

ś

wietlaj

ą

cego komunikaty o zdarzeniach typu “key event”. 

Przycisk na dole umo

Ŝ

liwia wyzerowanie pola i obszaru tekstowego. 

 

 
Fragment kodu obejmuj

ą

cy obsług

ę

 zdarze

ń

 klawiatury: 

public class KeyEventDemo ...  implements KeyListener ... { 

    ...// W kodzie inicjalizacji: 

background image

13. Swing - obsługa zdarze

ń

 

W. Kasprzak: Programowanie zdarzeniowe 

13 - 51 

 

typingArea = new JTextField(20); 

 

typingArea.addKeyListener(this); 

    ... 

    /** Obsługa zdarzenia “key typed” dla pola tekstowego. */ 

    public void keyTyped(KeyEvent e) { 
 

displayInfo(e, "KEY TYPED: "); 

    } 

    /** Obsługa zdarzenia “key pressed” dla pola tekstowego. */ 

    public void keyPressed(KeyEvent e) { 
 

displayInfo(e, "KEY PRESSED: "); 

    } 

    /** Obsługa zdarzenia “key released” dla pola tekstowego. */ 

    public void keyReleased(KeyEvent e) { 
 

displayInfo(e, "KEY RELEASED: "); 

    } 
    ... 

 

// Nasza metoda analizy wprowadzonych danych i wy

ś

wietlania 

 

   protected void displayInfo(KeyEvent e, String s){ 

       // komunikatu 

 

... 

13. Swing - obsługa zdarze

ń

 

W. Kasprzak: Programowanie zdarzeniowe 

13 - 52 

 

char c = e.getKeyChar();   

// Pobierz wprowadzony znak

 

 

int keyCode = e.getKeyCode(); 

// Pobierz kod klawisza 

 

int modifiers = e.getModifiers(); 

// Pobierz kod klawisza specjalnego 

 

... 

 

tmpString = KeyEvent.getKeyModifiersText(modifiers); 

 

 

...// Tu wyświetlenie informacji o zdarzeniach typu KeyEvent... 

    } 

 

W  interfejsie 

KeyListener

  i  klasie  adaptera 

KeyAdapter

  zadeklarowano 

wzgl. zdefiniowano trzy metody: 

 

void keyTyped(KeyEvent) 

– wołana po wprowadzeniu znaku Unikodu do 

nadzorowanego komponentu; 

 

void  keyPressed(KeyEvent)

 

–  wołana  po  naci

ś

ni

ę

ciu  klawisza,  gdy 

nadzorowany komponent posiada kontekst klawiatury; 

void  keyReleased(KeyEvent)

 

–  wołana  po  zwolnieniu  klawisza,  gdy 

nadzorowany komponent posiada kontekst klawiatury; 

background image

13. Swing - obsługa zdarze

ń

 

W. Kasprzak: Programowanie zdarzeniowe 

13 - 53 

 
Ka

Ŝ

da  z  metod  posiada  jeden  parametr  klasy 

KeyEvent

.  W  tej  klasie 

zdefiniowano  po

Ŝ

yteczne  metody  dla  ustalenia  podczas  obsługi 

szczegółów zdarzenia: 
 

int getKeyChar()  
void setKeyChar(char)

 

 - pobierz lub ustaw znak Unikodu zwi

ą

zany z tym 

zdarzeniem; 

 

int getKeyCode()  
void  setKeyCode(int)

  - 

pobierz  lub  ustaw  kod  klawisza  zwi

ą

zany  z  tym 

zdarzeniem - w klasie 

KeyEvent

 zdefiniowano stałe reprezentuj

ą

ce kody 

klawiszy  –  np. 

VK_A

  dla  klawisza  A

VK_ESCAPE

  dla  klawisza 

ESCAPE

.  

 

void  setModifiers(int) 

–  ustawia  stan  klawisza  modyfikuj

ą

cego  dla  tego 

zdarzenia  –  stan  mo

Ŝ

e  by

Ŝ

  pobrany  metod

ą

 

getModifiers

  klasy 

InputEvent

13. Swing - obsługa zdarze

ń

 

W. Kasprzak: Programowanie zdarzeniowe 

13 - 54 

 

String getKeyText()  
String  getKeyModifiersText()

   

-  zwraca  opisy  tekstowe  klawisza  wzgl. 

klawisza modyfikuj

ą

cego dla zdarzenia. 

 

Klasa 

KeyEvent

 dziedziczy metody z klas 

InputEvent

 i 

ComponentEvent

Metody te opisane b

ę

d

ą

 dla klasy 

MouseEvent

Component getComponent()  
void consume()  
int getWhen()  
boolean isAltDown()  
boolean isControlDown()  
boolean isMetaDown()  
boolean isShiftDown()  
int getModifiers()  

background image

13. Swing - obsługa zdarze

ń

 

W. Kasprzak: Programowanie zdarzeniowe 

13 - 55 

9) Zdarzenia dla myszy (Mouse Listener)  

Zdarzenia  pochodz

ą

ce  od  “myszy”  s

ą

  generowane  w  wyniku  interakcji 

u

Ŝ

ytkownika  z  komponentem  za  pomoc

ą

  myszy  (lub  podobnego 

urz

ą

dzenia wej

ś

ciowego).  

 

Zdarzenia zwi

ą

zane ze zmian

ą

 stanu myszy



 kursor 

wchodzi 

do obszaru ekranu dla komponentu, 



 kursor

 wychodzi

 z obszaru ekranu dla komponentu, 



 u

Ŝ

ytkownik 

wciska

 przycisk myszy, 



 u

Ŝ

ytkownik 

zwalnia

 przycisk myszy, 



 

klikni

ę

cie 

„lewym” przyciskiem myszy. 

 
Zdarzenia  zwi

ą

zane  z  ruchem  myszy  zebrane  s

ą

  w  odr

ę

bny  typ 

zdarze

ń

 

MouseMotionListener

 
Klasa  adaptera 

MouseInputAdapter

  implementuje  oba  interfejsy: 

MouseListener

 i 

MouseMotionListener

.  

 

13. Swing - obsługa zdarze

ń

 

W. Kasprzak: Programowanie zdarzeniowe 

13 - 56 

Przykład  13.12

.  Aplet 

MouseEventDemo

  zawiera  obsług

ę

  zdarze

ń

  myszy 

dla  górnego  obszaru  (pustego)  (BlankArea)  i  dla  kontenera 
zawieraj

ą

cego ten obszar (klasa MouseEventDemo). O wygenerowanym 

zdarzeniu informuje tekst pojawiaj

ą

cy si

ą

 w dolnym obszarze tekstowym. 

 

Kod obsługi zdarze

ń

 myszy: 

public class MouseEventDemo ... implements MouseListener { 

 

...// W kodzie inicjalizacji: 

        // Rejestracja obsługi zdarze

ń

 myszy dla “blankArea” i panelu. 

        blankArea.addMouseListener(this); 
        addMouseListener(this); 
    ... 
    public void mousePressed(MouseEvent e) { 

// Obsługa przyciśnięcia 

       saySomething("Mouse pressed; # of clicks: " 

background image

13. Swing - obsługa zdarze

ń

 

W. Kasprzak: Programowanie zdarzeniowe 

13 - 57 

                    + e.getClickCount(), e); 
    } 
    public void mouseReleased(MouseEvent e) { /

/ Obsługa zwolnienia  

       saySomething("Mouse released; # of clicks: " 
                    + e.getClickCount(), e); 
    } 
    public void mouseEntered(MouseEvent e) { 

// Obsługa wejścia 

       saySomething("Mouse entered", e); 
    } 
    public void mouseExited(MouseEvent e) { 

// Obsługa wyjścia 

       saySomething("Mouse exited", e); 
    } 
    public void mouseClicked(MouseEvent e) { 

// Obsługa kliknięcia 

       saySomething("Mouse clicked (# of clicks: " 
                    + e.getClickCount() + ")", e); 
    } 
    void saySomething(String opis, MouseEvent e) { 
        textArea.append(opis + " detected on " 
                        + e.getComponent().getClass().getName() 

13. Swing - obsługa zdarze

ń

 

W. Kasprzak: Programowanie zdarzeniowe 

13 - 58 

                        + "." + newline); 
    } 

Interfejs 

MouseListener

 i jego adapter 

MouseAdapter

 deklaruj

ą

 metody: 

void  mouseClicked(MouseEvent)

 

–  wołana  zaraz  po  klikni

ę

ciu  przez 

u

Ŝ

ytkownika nadzorowanego komponentu; 

void  mouseEntered(MouseEvent)

 

–  wołana  zaraz  po  wprowadzeniu 

kursora w obszar ekranu dla nadzorowanego komponentu; 

void  mouseExited(MouseEvent)

 

–  wołana  zaraz  po  wyprowadzeniu 

kursora z obszaru ekranu dla nadzorowanego komponentu; 

void  mousePressed(MouseEvent)

 

–  wołana  zaraz  po  przyci

ś

ni

ę

ciu 

przycisku myszy podczas, gdy kursor znajduje si

ę

 w obszaru ekranu dla 

nadzorowanego komponentu; 

void  mouseReleased(MouseEvent)

 

–  wołana  zaraz  po  zwolnieniu 

przycisku myszy podczas, gdy kursor znajduje si

ę

 w obszaru ekranu dla 

nadzorowanego komponentu; 

Uwaga.

  Gdy  u

Ŝ

ytkownik  “przeci

ą

ga”  komponent  –  przyciska  i  trzyma 

przyci

ś

ni

ę

ty przycisk a w tym czasie przesuwa kursor myszy – zdarzenia 

background image

13. Swing - obsługa zdarze

ń

 

W. Kasprzak: Programowanie zdarzeniowe 

13 - 59 

mouse 

entered

”, 

mouse 

exited

”, 

mouse 

released

” 

dotycz

ą

 

przeci

ą

ganego komponentu wł

ą

cznie z ko

ń

cowym „

mouse released

”. 

 

Ka

Ŝ

da z powy

Ŝ

szych metod posiada parametr klasy 

MouseEvent

.  

W tej klasie zdefiniowano kilka po

Ŝ

ytecznych metod: 

int  getClickCount() 

–  zwraca  liczb

ę

  szybko  po  sobie  nast

ę

puj

ą

cych 

klikni

ęć

, np. 2 dla „double click”; 

 

int getX()  
int getY()  
Point  getPoint()

  - 

zwracaj

ą

  współrz

ę

dne  kursora,  gdy  zdarzenie  zaszło, 

wzgl

ę

dem punktu odniesienia komponentu; 

 

boolean  isPopupTrigger()

  - 

zwraca  warto

ść

  „true”,  gdy  zdarzenie  myszy 

powinno  wy

ś

wietli

ć

  „pop-up”  menu;  powinno  by

ć

  wołane  podczas 

obsługi zdarze

ń

 typu „mouse pressed” i „mouse released” dla wszystkich 

komponentów, które mog

ą

 zawiera

ć

 „pop-up” menu.  

 

Klasa 

MouseEvent

  dziedziczy  te

Ŝ

  po

Ŝ

yteczn

ą

  metod

ę

  z  klasy 

13. Swing - obsługa zdarze

ń

 

W. Kasprzak: Programowanie zdarzeniowe 

13 - 60 

ComponentEvent

Component  getComponent

 

–  zwraca  komponent,  który  wygenerował 

zdarzenie;  mo

Ŝ

e  by

Ŝ

  wykorzystana  zamiast  bardziej  ogólnej  metody 

getSource

 
Klasa 

MouseEvent

  dziedziczy  te

Ŝ

  kilka  po

Ŝ

ytecznych  metod  z  klasy 

InputEvent

 

int  getWhen()

 

–  zwraca  indeks  chwili  czasowej,  gdy  zdarzenie  to 

wyst

ą

piło  –  im  wy

Ŝ

sza  warto

ść

  indeksu  tym  bli

Ŝ

sza  jest  ta  chwila 

aktualnej chwili. 

 

boolean isAltDown()  
boolean isControlDown()  
boolean isMetaDown()  
boolean  isShiftDown()

 

–  zwraca  stan  indywidualnych  klawiszy 

modyfikujacych w chwili zaj

ś

cia zdarzenia; 

 

int  getModifiers()

 

–  zwraca  stan  wszystkich  klawiszy  modyfikuj

ą

cych  i 

background image

13. Swing - obsługa zdarze

ń

 

W. Kasprzak: Programowanie zdarzeniowe 

13 - 61 

przycisków  myszy  w  chwili,  gdy  wyst

ą

piło  to  zdarzenie;  w  klasie 

InputEvent zdefiniowano stałe dla rozpatrywanych przycisków i klawiszy: 

ALT_MASK, BUTTON1_MASK, BUTTON2__MASK,  
BUTTON3_MASK, CTRL_MASK, META_MASK, SHIFT_MASK.  

Np.  poni

Ŝ

sze  wyra

Ŝ

enie  jest  prawdziwe  gdy  wci

ś

ni

ę

to  prawy  przycisk 

myszy: 

 (mouseEvent.getModifiers() & InputEvent.BUTTON3_MASK) 
== InputEvent.BUTTON3_MASK 

 
W  klasie 

SwingUtilities

  istniej

ą

  metody  sprawdzaj

ą

ce,  czy  wci

ś

ni

ę

to 

przycisk myszy: 

static boolean isLeftMouseButton(MouseEvent)  
static boolean isMiddleMouseButton(MouseEvent)  
static boolean isRightMouseButton(MouseEvent) 

 

13. Swing - obsługa zdarze

ń

 

W. Kasprzak: Programowanie zdarzeniowe 

13 - 62 

10) Zdarzenia ruchu myszy (Mouse Motion Listener)  

Zdarzenia  typu  “mouse-motion  events”  s

ą

  reakcj

ą

  na  ruch  kursora  na 

ekranie sterowany mysz

ą

 (lub podobnym urz

ą

dzeniem wej

ś

ciowym). 

 
Interfejs 

MouseMotionListener

  i  klasa  adaptera 

MouseMotionAdapter

 

deklaruj

ą

 dwie metody: 

 

void  mouseDragged(MouseEvent)

 

–  wołana  dla  ruchu  myszy  w 

sytuacji,  gdy  przycisk  myszy  jest  wci

ś

ni

ę

ty  –  zdarzenie  generowane 

jest  przez  komponent,  który  uprzednio  wygenerował  te

Ŝ

  zdarzenie 

mouse  pressed”,  nawet  je

ś

li  kursor  nie  znajduje  si

ę

  ju

Ŝ

  nad  tym 

komponentem. 

 

void  mouseMoved(MouseEvent)

 

-  wołana  dla  ruchu  myszy,  gdy 

przyciski myszy nie s

ą

 wci

ś

ni

ę

te – zdarzenie generowane jest przez 

komponent znajduj

ą

cy sie aktualnie pod kursorem. 

 
Uwaga: parametr obu metod jest klasy 

MouseEvent

 

background image

13. Swing - obsługa zdarze

ń

 

W. Kasprzak: Programowanie zdarzeniowe 

13 - 63 

Przykład  13.13.

  Aplet 

MouseMotionEventDemo

  ilustruje  obsług

ę

  ruchu 

kursora 

górnym 

obszarze 

pustym. 

Implementuje 

metody 

mouseDragged

  i 

mouseMoved

  podaj

ą

c  w  dolnym  obszarze  tekstowym 

informacj

ę

 o współrz

ę

dnych kursora. 

 

Kod implementuj

ą

cy obsług

ę

 zdarze

ń

 ruchu myszy: 

public class MouseMotionEventDemo extends JApplet  
                                  implements MouseMotionListener { 

    //...W kodzie inicjalizacji: 
        // Rejestracja dla zdarze

ń

 ruchu myszy w obszarze blankArea i 

        // całego apletu (panelu).  

        blankArea.addMouseMotionListener(this); 
        addMouseMotionListener(this); 
        ... 

13. Swing - obsługa zdarze

ń

 

W. Kasprzak: Programowanie zdarzeniowe 

13 - 64 

    } 
    public void mouseMoved(MouseEvent e) { 

// Ruch myszy 

       saySomething("Mouse moved", e); 
    } 
    public void mouseDragged(MouseEvent e) { 

// Pochwycenie myszą 

       saySomething("Mouse dragged", e); 
    } 
    void saySomething(String opis, MouseEvent e) { 
        textArea.append(opis  
                        + " (" + e.getX() + "," + e.getY() + ")" 
                        + " detected on " 
                        + e.getComponent().getClass().getName() 
                        + newline); 
    } 

 

background image

13. Swing - obsługa zdarze

ń

 

W. Kasprzak: Programowanie zdarzeniowe 

13 - 65 

Przykład  13.14.

  Program 

SelectionDemo

  wyrysowuje  prostok

ą

t  jako 

reakcj

ę

  na  zdarzenie  przeci

ą

gania  mysz

ą

.  Zawiera  obsług

ą

  trzech 

zdarze

ń

  myszy:  “

mouse  press”,  “mouse  drag”,  “mouse  release

”. 

Wymaga 

to 

implementacji 

obu 

interfejsów: 

MouseListener

 

MouseMotionListener

W  tym  celu  dziedziczymy  z  klasy  adaptera 

MouseInputAdapter

.  

...// W kodzie inicjalizacji w klasie głównej : 

    MyListener myListener = new MyListener(); 
    addMouseListener(myListener); 
    addMouseMotionListener(myListener); 
... 

// Klasa dla obsługi zdarze

ń

 myszy 

class MyListener extends MouseInputAdapter { 
    public void mousePressed(MouseEvent e) { 
        int x = e.getX(); 
        int y = e.getY(); 
        currentRect new Rectangle(x, y, 0, 0); 
        updateDrawableRect(getWidth(), getHeight()); 
        repaint(); 

13. Swing - obsługa zdarze

ń

 

W. Kasprzak: Programowanie zdarzeniowe 

13 - 66 

    } 
    public void mouseDragged(MouseEvent e) { 
        updateSize(e); 
    } 
    public void mouseReleased(MouseEvent e) { 
        updateSize(e); 
    } 
    void updateSize(MouseEvent e) { 
        int x = e.getX(); 
        int y = e.getY(); 
        ... 
        repaint(...); 
    } 

 

background image

13. Swing - obsługa zdarze

ń

 

W. Kasprzak: Programowanie zdarzeniowe 

13 - 67 

13.5 Klasy 

AbstractAction, Action

 

1) Klasa 

Action

 

Je

ś

li  zdarzenia  dla  dwóch  lub  wi

ę

cej  komponentów  prowadz

ą

  do 

wykonania tej samej funkcji programu to sensowne staje si

ę

 wprowadzenie wspólnego typu zdarzenia, np. 

ActionListener

 utworzenie  jednego  obiektu  klasy 

Action

  implementuj

ą

cego  t

ę

 

funkcj

ę

 

Zdarzenia „akcji” 

generuje szereg komponentów: przyciski, opcje menu, 

pola tekstowe, pola wyboru, itd. 
 
Klasy posiadaj

ą

ce metody 

setAction

 

i

 

getAction

 

: 

AbstractButton , JComboBox , JTextField 

 

Przykład  13.15.

  Obsługa  zdarzenia  akcji  dla  przycisku  i  opcji  menu 

b

ę

dzie wykonywa

ć

 t

ę

 sam

ą

 funkcj

ę

Action leftAction = new LeftAction();  
... 

13. Swing - obsługa zdarze

ń

 

W. Kasprzak: Programowanie zdarzeniowe 

13 - 68 

button = new JButton(leftAction) 
... 
menuItem = new JMenuItem(leftAction); 

 

ź

niejsze

  ni

Ŝ

  w  trakcie  inicjalizacji

  doł

ą

czenie  obiektu  „akcji”  do 

komponentu

 nast

ę

puje zwykle metod

ą

 

setAction

 
Obiekt  typu 

Action

 

doł

ą

czony  do  komponentu 

jest  domy

ś

lnie 

zarejestrowany

 dla obsługi zdarze

ń

 akcji (“action events”) komponentu. 

 
Obiekt typu 

Action

 zapewnia obsług

ę

 zdarze

ń

 akcji i mo

Ŝ

e te

Ŝ

 zapewni

ć

 

centralne  zarz

ą

dzanie  stanem

  komponentu  generuj

ą

cego  takie 

zdarzenia: 

-

 

stan  komponentu

  odpowiada  stanowi  obiektu  akcji;  np.  obiekt  akcji 

przekazuje komponentowi tekst i ikonk

ę

-

 

zmiana  stanu  obiektu  akcji

  powoduje  odpowiedni

ą

  zmian

ę

  stanu 

wszystkich komponentów, do których jest doł

ą

czony. 

 

background image

13. Swing - obsługa zdarze

ń

 

W. Kasprzak: Programowanie zdarzeniowe 

13 - 69 

Utworzenie  przez  programist

ę

 

własnej  obsługi  poprzez  obiekt  typu 

Action

 

polega na: 

 zdefiniowaniu klasy pochodnej od klasy 

AbstractAction

 i 

 utworzeniu jej obiektu, pod warunkiem, 

Ŝ

 ta klasa pochodna implementuje metod

ę

 

actionPerformed

 . 

 

Przykład  13.15  (c.d.)

    Definicja  własnej  klasy 

LeftAction 

pochodnej  po 

AbstractAction

 i utworzenie jej obiektu 

leftAction

 . 

// W klasie głównej ActionDemo 

leftAction = new LeftAction("W lewo", anIcon, 
             "To jest lewy przycisk.", 
             new Integer(KeyEvent.VK_L)); 

// ALT + L

 - klawisz skrótu 

... 

// Klasa LeftAction 

class LeftAction extends AbstractAction { 
    public LeftAction(String text, ImageIcon icon, 
                      String desc, Integer mnemonic) { 
        super(text, icon); 

13. Swing - obsługa zdarze

ń

 

W. Kasprzak: Programowanie zdarzeniowe 

13 - 70 

 

// Ustaw własno

ść

 obiektu akcji  

        putValue(SHORT_DESCRIPTION, desc); 

// Tekst wskazówki oraz

 

        putValue(MNEMONIC_KEY, mnemonic); 

// ... klawisz skrótu

 

    } 

// Obsługa zdarzenia akcji 

    public void actionPerformed(ActionEvent e) { 
        displayResult("Akcja dla przycisku 1 / opcji menu", e); 
    } 

Program 

ActionDemo

  zawiera  definicje 

trzech  akcji

  –  ka

Ŝ

da  z  nich 

dołaczona jest do 

przycisku 

opcji menu.

 Skróty klawiszy aktywuj

ą

: Alt-L 

(lewy przycisk), Alt-M (

ś

rodkowy przycisk), Alt-R (prawy przycisk). 

       

 

background image

13. Swing - obsługa zdarze

ń

 

W. Kasprzak: Programowanie zdarzeniowe 

13 - 71 

Stany  3  obiektów  akcji  (dozwolona/niedozwolona)  mo

Ŝ

na  ustawia

ć

  w 

pod-menu „Action State”. Kod realizuj

ą

cy ustawienie stanu akcji: 

boolean selected = 

... // true jesli akcja jest dozwolona

; 

                      

//false, jesli akcja jest zabroniona 

leftAction.setEnabled(selected); 

 

Po  utworzeniu  komponentów  wykorzystuj

ą

cych  obiekty  akcji  mo

Ŝ

na 

zmieni

ć

 indywidualne komponenty. Np. przez usuni

ę

cie ikony (w menu) 

lub usuni

ę

cie tekstu (w przyciskach): 

menuItem = new JMenuItem(); 
menuItem.setAction(leftAction); 
menuItem.setIcon(null); 

// 

Usuwa ikon

ę

 z menu.

  

... 
button = new JButton(); 
button.setAction(leftAction); 
button.setText(""); 

// 

Na razie przycisk nie zawiera tekstu

  

13. Swing - obsługa zdarze

ń

 

W. Kasprzak: Programowanie zdarzeniowe 

13 - 72 

2) Klasa 

AbstractAction

 

AbstractAction()  
AbstractAction(String)  
AbstractAction(String, Icon) 

Konstruktory.  Parametry  umo

Ŝ

liwiaj

ą

  ustawienie  tekstu  i  ikonki  dla 

kontrolowanego przez akcj

ę

 komponentu. 

 

void setEnabled(boolean) 
boolean isEnabled() 

Ustaw wzgl. sprawd

ź

, czy zdarzenia komponentu kontrolowanego przez 

akcj

ę

 s

ą

 dozwolone. 

 

void putValue(String, Object) 
Object getValue(String) 

Ustaw własno

ść

 lub pobierz obiekt zwi

ą

zany z własno

ś

ci

ą

 obiektu akcji. 

background image

13. Swing - obsługa zdarze

ń

 

W. Kasprzak: Programowanie zdarzeniowe 

13 - 73 

3) Własno

ś

ci akcji 

Obiekt  klasy 

AbstractAction

  posiada  szereg  własno

ś

ci,  których 

ustawianie  powoduje  automatycznie  zmian

ę

  odpowiednich  ustawie

ń

 

komponentów, do których obiekt akcji jest doł

ą

czony.  

Np. ustawienie własno

ś

ci 

ACCELERATOR_KEY

 dla akcji po dołaczeniu 

akcji  do  opcji  menu  spowoduje  automatyczne  wywołanie  metody 

JMenuItem.setAccelerator(KeyStroke)

,  gdzie 

KeyStroke 

identfikuje  typ  dla 

zestawu klawiszy – akceleratorów.  
 

Własno

ść

 

Automatycznie wpływa na 

obiekt klasy 

(wywoływana metoda) 

Cel 

ACCELERATOR_KEY 

JMenuItem  
(setAccelerator)  

Akcelerator umo

Ŝ

liwia 

wybranie opcji niezale

Ŝ

nie 

od jej widoczno

ś

ci. 

ACTION_COMMAND_KEY 

AbstractButton, JCheckBox, 
JRadioButton  
(setActionCommand
)  

Napis rozkazu zwi

ą

zany 

ze zdarzeniem akcji.  

13. Swing - obsługa zdarze

ń

 

W. Kasprzak: Programowanie zdarzeniowe 

13 - 74 

 
LONG_DESCRIPTION 
 

brak  

Dłu

Ŝ

szy opis akcji.  

MNEMONIC_KEY 

AbstractButton, 
JMenuItem, JCheckBox, 
JRadioButton  
(setMnemonic
)  

Skrót dla akcji  

NAME 

AbstractButton, 
JMenuItem, JCheckBox, 
JRadioButton  
(setText
)  

Nazwa akcji.  

SHORT_DESCRIPTION 

AbstractButton, JCheckBox, 
JRadioButton  
(setToolTipText
)  

Wskazówka o akcji  

 
SMALL_ICON 
 

AbstractButton, JMenuItem  
(setIcon
)  

Ikona akcji.