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

Kontenery  pozwalają  na  pogrupowanie  kontrolek  i  wspólne  zarządzanie  ich 
rozmieszczaniem, wyglądem, przesuwem, usuwaniem itd. (np. PanelFrame
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 
(ColorFontMenu, 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

 

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  

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

ś

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

ć

 ró

Ŝ

ny wygl

ą

d to trzeba zdefiniowa

ć

 kilka klas.  

Przykład 7.15.b 

import java.awt.*; 
public class WieleOkien2 extends Frame { 

// Definicja nowego typu ramki 

  public WieleOkien2(String napis) { 
     add(new Label(napis, Label.CENTER)); 

// Zawiera etykietę w środku

 

     pack(); 
     setSize(400,100); 
     setVisible(true); 
  } 
  public static void main(String args[]) { 
     new WieleOkien2("Napis w pierwszym oknie"); 

// PokaŜe ramkę 2. 

     new Przycisk("Napis na przycisku"); 

// PokaŜe ramkę „przycisk”. 

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

Ŝ

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 

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

ć

 

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