Wprowadzenie do biblioteki Swing

Transkrypt

Wprowadzenie do biblioteki Swing
Wprowadzenie
do biblioteki
Swing
Agnieszka
Zbrzezny
Programowanie
w środowisku
graficznym
Wprowadzenie do biblioteki Swing
Agnieszka Zbrzezny
Biblioteka
Swing
Typy zdarzeń
niskiego
poziomu
Komponenty
Swing
interfejsu
użytkownika
Zakład Teoretycznych Podstaw Informatyki
Instytut Matematyki i Informatyki
Akademia Jana Długosza w Cz˛estochowie
Materiały pomocnicze przygotowane na podstawie ksiażki
˛
Cay S. Horstmann, Gary Cornell
JavaTM . Podstawy. Wydanie VIII
Semestr zimowy 2013/2014
1 / 43
Wprowadzenie
do biblioteki
Swing
Agnieszka
Zbrzezny
Programowanie
w środowisku
graficznym
Biblioteka
Swing
Typy zdarzeń
niskiego
poziomu
Komponenty
Swing
interfejsu
użytkownika
2 / 43
Wersja Javy 1.0 zawierała bibliotek˛e klas służacych
˛
do programowania graficznych interfejsów użytkownika
(GUI). Biblioteka ta została nazwana Abstract
Windowing Toolkit (AWT)
W wersji Javy 1.2 wprowadzono bibliotek˛e Swing,
która jest nadbudowana nad biblioteka˛ AWT.
Powody dla których warto używać biblioteki Swing sa˛
nastepuj
˛ ace:
˛
Biblioteka Swing zawiera bogaty i poreczny
˛
zbiór
elementów interfejsu użytkownika.
Jest ona w niewielkim tylko stopniu zależna od
konkretnej platformy sprz˛etowej, a w zwiazku
˛
z tym
mniej podatna na błedy
˛ zwiazane
˛
z konkretna˛ platforma˛
sprz˛etowa.
˛
Pozwala tworzyć interfejsy graficzne niezależne od
konkretnej platformy sprz˛etowej.
Tworzenie ramek
Wprowadzenie
do biblioteki
Swing
Agnieszka
Zbrzezny
Programowanie
w środowisku
graficznym
Biblioteka
Swing
Typy zdarzeń
niskiego
poziomu
Komponenty
Swing
interfejsu
użytkownika
Ramka to okno najwyższego poziomu, tzn. okno, które
nie jest zawarte w żadnym innym oknie.
Biblioteka AWT zawiera klase˛ Frame umożliwiajac
˛ a˛
tworzenie ramek, zaś biblioteka Swing zawiera klase˛
JFrame, która dziedziczy po klasie Frame.
Wiekszość
˛
klas z biblioteki Swing ma nazwy
zaczynajace
˛ sie˛ od litery J, np. JButton, JFrame,
JMenu, itd.
Klasy Button, Frame, Menu, itd. sa˛ komponentami
biblioteki AWT. W przypadku ominiecia
˛
litery J program
może sie˛ kompilować i wykonywać, ale może
wykazywać niekonsekwencje w wygladzie
˛
iw
zachowaniu.
Example
3 / 43
Program 001: SimpleFrameTest.java
Pozycjonowanie ramek
Wprowadzenie
do biblioteki
Swing
Agnieszka
Zbrzezny
Programowanie
w środowisku
graficznym
Biblioteka
Swing
Typy zdarzeń
niskiego
poziomu
Komponenty
Swing
interfejsu
użytkownika
Najważniejsze metody używane do ustalania rozmiaru
i położenia ramek:
metoda dispose, która zamyka okno oraz zwalnia
wszystkie zasoby systemowe użyte do jego utworzenia
metoda setIconImage, której argumentem jest obiekt
klasy Image traktowany jako ikona w przypadku
zminimalizowania okna
metoda setTitle zmieniajaca
˛ tekst na pasku
tytułowym
metoda setResizable, której argumentem jest
wartość typu boolean określajaca
˛ czy użytkownik
bedzie
˛
mógł zmieniać rozmiar ramki
Example
Program 002: CenteredFrameTest.java
4 / 43
Hierarchia dziedziczenia dla klas JFrame oraz
JPanel
Wprowadzenie
do biblioteki
Swing
Agnieszka
Zbrzezny
Programowanie
w środowisku
graficznym
Biblioteka
Swing
Typy zdarzeń
niskiego
poziomu
Komponenty
Swing
interfejsu
użytkownika
5 / 43
Wybrane metody klasy
java.awt.Component
Wprowadzenie
do biblioteki
Swing
Agnieszka
Zbrzezny
Programowanie
w środowisku
graficznym
Biblioteka
Swing
Typy zdarzeń
niskiego
poziomu
Komponenty
Swing
interfejsu
użytkownika
6 / 43
public boolean isVisible()
Sprawdza czy komponent this powinien być widoczny
o ile jego rodzic jest widoczny. Poczatkowo
˛
wszystkie
komponenty, za wyjatkiem
˛
komponentów najwyższego
poziomu takich jak JFrame, sa˛ widoczne.
public void setVisible(boolean b)
Pokazuje lub ukrywa komponent this.
public boolean isShowing()
Sprawdza czy komponent this pokazuje sie˛ na ekranie.
Aby tak było musi on być widoczny jak również jego
rodzic musi być widoczny i musi pokazywać sie˛ na
ekranie.
Wybrane metody klasy
java.awt.Component
Wprowadzenie
do biblioteki
Swing
Agnieszka
Zbrzezny
Programowanie
w środowisku
graficznym
Biblioteka
Swing
Typy zdarzeń
niskiego
poziomu
Komponenty
Swing
interfejsu
użytkownika
7 / 43
public boolean isEnabled()
Sprawdza czy komponent this jest umożliwiony, tzn.
czy może reagować na działania użytkownika (np.
naciśniecia
˛
klawiszy) oraz czy może generować
zdarzenia. Poczatkowo
˛
wszystkie komponenty sa˛
umożliwione.
public void setEnabled(boolean b)
Umożliwia lub uniemożliwia komponent this.
Point getLocation()
Zwraca położenie lewego górnego rogu komponentu
this wzgledem
˛
położenia lewego górnego rogu jego
rodzica.
public Point getLocationOnScreen()
Zwraca bezwgledne
˛
położenie lewego górnego rogu
komponentu this.
Wybrane metody klasy
java.awt.Component
Wprowadzenie
do biblioteki
Swing
Agnieszka
Zbrzezny
Programowanie
w środowisku
graficznym
Biblioteka
Swing
Typy zdarzeń
niskiego
poziomu
Komponenty
Swing
interfejsu
użytkownika
8 / 43
public void setBounds(
int x, int y, int width, int height)
Zmienia położenie oraz rozmiar komponentu this.
public void setLocation(int x, int y)
public void setLocation(Point p)
Zmienia położenie komponentu this.
public Dimension getSize()
Pobiera rozmiar komponentu this.
public void setSize(int width, int
height)
public void setSize(Dimension d)
Zmienia rozmiar komponentu this.
Wybrane metody klasy java.awt.Window
Wprowadzenie
do biblioteki
Swing
Agnieszka
Zbrzezny
Programowanie
w środowisku
graficznym
Biblioteka
Swing
Typy zdarzeń
niskiego
poziomu
Komponenty
Swing
interfejsu
użytkownika
9 / 43
public void toFront()
Jeżeli okno this jest widoczne, to przenosi je na szczyt
stosu wszystkich okien.
public void toBack()
Jeżeli okno this jest widoczne, to przenosi je na dno
stosu wszystkich okien.
Wybrane metody klasy java.awt.Frame
Wprowadzenie
do biblioteki
Swing
Agnieszka
Zbrzezny
Programowanie
w środowisku
graficznym
Biblioteka
Swing
Typy zdarzeń
niskiego
poziomu
Komponenty
Swing
interfejsu
użytkownika
10 / 43
public void setResizable(boolean b)
Umożliwia lub uniemożliwia zmiane˛ rozmiaru ramki
przez użytkownika.
public void setTitle(String title)
Ustawia napis title jako tytuł ramki wyświetlany na
pasku tytułowym.
Wybrane metody klasy java.awt.Frame
Wprowadzenie
do biblioteki
Swing
Agnieszka
Zbrzezny
Programowanie
w środowisku
graficznym
Biblioteka
Swing
Typy zdarzeń
niskiego
poziomu
Komponenty
Swing
interfejsu
użytkownika
11 / 43
public void setIconImage(Image image)
Ustawia obraz image jako ikone˛ ramki this.
public void setUndecorated(
boolean undecorated)
Ustawia lub usuwa dekoracje˛ ramki this˙
public boolean isUndecorated()
Zwraca true jeżeli ramka this ma usuniet
˛ a˛ dekoracje.
˛
public int getExtendedState()
Zwraca wartość całkowita˛ określajac
˛ a˛ stan ramki.
public void setExtendedState(int state)
Ustawia stan ramki na wartość state.
Możliwe stany to: Frame.NORMAL,
Frame.ICONIFIED, Frame.MAXIMIZED_HORIZ,
Frame.MAXIMIZED_VERT oraz
Frame.MAXIMIZED_BOTH
Wybrane metody klasy java.awt.Toolkit
Wprowadzenie
do biblioteki
Swing
Agnieszka
Zbrzezny
Programowanie
w środowisku
graficznym
Biblioteka
Swing
Typy zdarzeń
niskiego
poziomu
Komponenty
Swing
interfejsu
użytkownika
public static Toolkit
getDefaultToolkit()
Statyczna metoda pobierajaca
˛ domyślny zestaw
narz˛edziowy.
public abstract Dimension
getScreenSize()
Statyczna metoda pobierajaca
˛ rozmiar ekranu.
public abstract Image getImage(
String filename)
Metoda pobierajaca
˛ z pliku filename obrazek w
formacie GIF, JPEG lub PNG.
public abstract void beep()
Emituje sygnał dźwiekowy
˛
z głośniczka systemowego.
Example
12 / 43
Program 003: TalkingClockTest.java
Wyświetlanie komunikatów w panelu
Wprowadzenie
do biblioteki
Swing
Agnieszka
Zbrzezny
Programowanie
w środowisku
graficznym
Biblioteka
Swing
Typy zdarzeń
niskiego
poziomu
Komponenty
Swing
interfejsu
użytkownika
Chociaż komunikaty można wyświetlać bezpośrednio
w ramce, nie jest to dobra˛ programistyczna˛ praktyka.
˛
Ramki sa˛ zaprojektowane jako kontenery, do których
można dodawać elementy graficznego interfejsu
użytkownika, takie jak: przyciski, suwaki, paski menu,
listy wyboru i inne.
Aby wyświetlić komunikat należy do ramki dodać panel
i w nim wyświetlić komunikat.
Panele to obiekty klasy JPanel. Posiadaja˛ one dwie
użyteczne własności:
Posiadaja˛ powierzchnie,
˛ na której można rysować.
Sa˛ kontenerami, a wiec
˛ moga˛ również zawierać inne
elementy graficznego interfejsu użytkownika.
13 / 43
Wewnetrzna
˛
struktura obiektu typu JFrame
Wprowadzenie
do biblioteki
Swing
Agnieszka
Zbrzezny
Programowanie
w środowisku
graficznym
Biblioteka
Swing
Typy zdarzeń
niskiego
poziomu
Komponenty
Swing
interfejsu
użytkownika
14 / 43
Spośród uwidocznionych warstw tylko warstwa zawartości
(content pane) ma istotne znaczenie dla programistów
wykorzystujacych
˛
bibliotek˛e Swing.
Rysowanie na panelu
Wprowadzenie
do biblioteki
Swing
Agnieszka
Zbrzezny
Programowanie
w środowisku
graficznym
Biblioteka
Swing
Typy zdarzeń
niskiego
poziomu
Komponenty
Swing
interfejsu
użytkownika
Aby móc rysować na panelu należy:
utworzyć klase˛ dziedziczac
˛ a˛ po klasie JPanel oraz
przedefiniować w tej klasie metode˛ paintComponent.
Metoda paintComponent jest zdefiniowana w klasie
JComponent. Jej jedyny argument jest referencja˛ do
obiektu klasy Graphics. Obiekt ten pamieta
˛
ustawienia używane w rysowaniu tekstu i grafiki, takie
jak rodzaj czcionki, kolor tekstu i inne.
Nie należy nigdy wywoływać metody
paintComponent, ponieważ jest ona wywoływana
automatycznie w przypadku zaistnienia potrzeby
przerysowania cz˛eści wizualnych komponentów.
Aby wymusić przerysowanie komponentu należy
wywołać bezargumentowa˛ metode˛ repaint.
15 / 43
Wybrane metody zwiazane
˛
z rysowaniem
Wprowadzenie
do biblioteki
Swing
Agnieszka
Zbrzezny
Programowanie
w środowisku
graficznym
Biblioteka
Swing
Typy zdarzeń
niskiego
poziomu
Komponenty
Swing
interfejsu
użytkownika
public Container getContentPane()
zwraca referencje˛ do obiektu contentPane klasy
Container zwiazanego
˛
z ramka˛ this.
public void add(Component c)
dodaje komponent do obiektu contentPane ramki
this. Do wersji 1.4 włacznie
˛
metoda ta wyrzucała
wyjatek.
˛
public void repaint()
public void repaint(
int x, int y, int width, int height)
przerysowuje komponent (cz˛eść komponentu) “tak
szybko jak to możliwe”.
Example
Program 004: NotHelloWorld.java
16 / 43
Praca z kształtami 2D
Wprowadzenie
do biblioteki
Swing
Agnieszka
Zbrzezny
Programowanie
w środowisku
graficznym
Biblioteka
Swing
Typy zdarzeń
niskiego
poziomu
Komponenty
Swing
interfejsu
użytkownika
Poczawszy
˛
od wersji 1.0 Javy klasa Graphics
posiadała metody do rysowania linii, prostokatów
˛
oraz
elips. Jednakże operacje te miały bardzo ograniczone
możliwości.
W Javie 1.2 wprowadzono bibliotek˛e Java 2D, w której
zaimplementowano poteżny
˛
zbiór operacji graficznych.
Aby narysować kształt z użyciem biblioteki Java 2D
należy utworzyć obiekt klasy Graphics2D, która jest
podklasa˛ klasy Graphics.
Biblioteka Java 2D organizuje kształty geometryczne
w stylu obiektowym. W szczególności istnieja˛ klasy
reprezentujace
˛ linie, prostokaty
˛ i elipsy:
Line2D, Rectangle2D, Ellipse2D.
Klasy te implementuja˛ interfejs Shape.
17 / 43
Klasa Rectangle2D
Wprowadzenie
do biblioteki
Swing
Agnieszka
Zbrzezny
Programowanie
w środowisku
graficznym
Biblioteka
Swing
Typy zdarzeń
niskiego
poziomu
Komponenty
Swing
interfejsu
użytkownika
18 / 43
Klasa Rectangle2D jest klasa˛ abstrakcyjna˛ z dwoma
konkretnymi podklasami, które sa˛ statycznymi
wewnetrznymi
˛
klasami klasy Rectangle2D:
Rectangle2D.Float oraz Rectangle2D.Double.
Aby utworzyć obiekt klasy Rectangle2D.Float
należy w konstruktorze podać argumenty typu float:
Rectangle2D f = new Rectangle2D.Float
(10.0F, 25.0F, 22.5F, 20.0F);
Aby utworzyć obiekt klasy Rectangle2D.Double
należy w konstruktorze podać argumenty typu double:
Rectangle2D d = new Rectangle2D.Double
(10.0, 25.0, 22.5, 20.0);
Argumenty konstruktora oznaczaja˛ współrz˛edne
lewego, górnego rogu, szerokość oraz wysokość
prostokata.
˛
Uwagi dodatkowe o bibliotece Java 2D
Wprowadzenie
do biblioteki
Swing
Agnieszka
Zbrzezny
Programowanie
w środowisku
graficznym
Biblioteka
Swing
Typy zdarzeń
niskiego
poziomu
Komponenty
Swing
interfejsu
użytkownika
19 / 43
Jeżeli nie tworzymy w programie bardzo dużej liczby
obiektów, to można ograniczyć sie˛ do korzystania z
klasy Rectangle2D.Double.
Inne klasy implementujace
˛ interfejs Shape to
przykładowo: Line2D, Ellipse2D, Arc2D oraz ich
statyczne klasy wewnetrzne
˛
Float i Double.
Dodatkowa,
˛ bardzo użyteczna˛ klasa,
˛ jest klasa
Point2D oraz jej statyczne klasy wewnetrzne
˛
Float i
Double.
Klasy Rectangle2D oraz Ellipse2D dziedzicza˛ po
wspólnej klasie RectangularShape. Chociaż elipsy
nie sa˛ prostokatami
˛
to posiadaja˛ ograniczajacy
˛
prostokat.
˛
Uwagi dodatkowe o bibliotece Java 2D
Wprowadzenie
do biblioteki
Swing
Agnieszka
Zbrzezny
Programowanie
w środowisku
graficznym
Biblioteka
Swing
Typy zdarzeń
niskiego
poziomu
Komponenty
Swing
interfejsu
użytkownika
20 / 43
Klasa RectangularShape definiuje ponad 20 metod
wspólnych dla kształtów, w tym tak użyteczne jak:
getWidth, getHeight, getCenterX oraz
getCenterY.
Spadkowe klasy z wersji Javy 1.0, takie jak
Rectangle oraz Point zostały wpasowane w
hierarchie˛ klas implementujacych
˛
interfejs Shape.
Uwagi dodatkowe o bibliotece Java 2D
Wprowadzenie
do biblioteki
Swing
Agnieszka
Zbrzezny
Programowanie
w środowisku
graficznym
Biblioteka
Swing
Typy zdarzeń
niskiego
poziomu
Komponenty
Swing
interfejsu
użytkownika
Aby utworzyć obiekt klasy Rectangle2D lub
Ellipse2D należy podać współrz˛edne lewego
górnego rogu oraz szerokość i wysokość. W przypadku
elipsy argumenty te odnosza˛ sie˛ do ograniczajacego
˛
ja˛
prostokata.
˛
Jeżeli znamy położenie końców jednej z przekatnych
˛
prostokata
˛ ale nie wiemy czy sa˛ to lewy górny oraz
prawy dolny rogi, to należy najpierw utworzyć pusty
prostokat
˛ a nastepnie
˛
użyć metody
setFrameFromDiagonal.
Aby utworzyć odcinek należy podać jego końce, albo
jako obiekty typu Point2D albo jako współrz˛edne
poczatku
˛
i końca.
Example
21 / 43
Program 005: DrawTest.java
Używanie kolorów
Wprowadzenie
do biblioteki
Swing
Agnieszka
Zbrzezny
Programowanie
w środowisku
graficznym
Biblioteka
Swing
Typy zdarzeń
niskiego
poziomu
Komponenty
Swing
interfejsu
użytkownika
Metoda setPaint z klasy Graphics2D pozwala
wybrać kolor używany nastepnie
˛
w operacjach
rysowania.
Klasa java.awt.Color definiuje 13 kolorów:
BLACK
WHITE
ORANGE
GREEN
CYAN
GRAY
RED
MAGENTA
PINK
BLUE
YELLOW
Aby zdefiniować własny kolor należy utworzyć obiekt
klasy Color podajac
˛ składowe tego koloru:
Color(int redness, int greenness, int
blueness) // argumenty z zakresu 0 - 255
Aby ustawić kolor tła należy użyć metody
setBackground z klasy Component.
22 / 43
LIGHT_GRAY
DARK_GRAY
Kolory systemowe
Wprowadzenie
do biblioteki
Swing
Agnieszka
Zbrzezny
Programowanie
w środowisku
graficznym
Biblioteka
Swing
Typy zdarzeń
niskiego
poziomu
Komponenty
Swing
interfejsu
użytkownika
Klasa SystemColor definiuje kolory systemowe dla
różnych elementów interfejsu użytkownika.
Przykładowo, aby ustawić systemowy kolor tła panelu
należy użyć koloru SystemColor.window:
MyPanel p = new MyPanel();
p.setBackground(SystemColor.window);
Używanie kolorów z klasy SystemColor zapewnia
zgodność używanych kolorów z tymi używanymi na
pulpicie użytkownika.
Example
Program 006: FillTest.java
23 / 43
Biblioteka Swing – używanie czcionek
Wprowadzenie
do biblioteki
Swing
Agnieszka
Zbrzezny
Programowanie
w środowisku
graficznym
Biblioteka
Swing
Typy zdarzeń
niskiego
poziomu
Komponenty
Swing
interfejsu
użytkownika
Czcionki w Javie dziela˛ sie˛ na dwa rodzaje: czcionki
logiczne oraz czcionki fizyczne.
Czcionki fizyczne sa˛ zależne od systemu, na którym
działa maszyna wirtualna, natomiast czcionki logiczne
to rodziny czcionek, które musza˛ być obsługiwane
przez każde środowisko uruchomieniowe Javy.
W środowisku Java 2 jest dostepnych
˛
jedynie pieć
˛
czcionek logicznych: Serif, SansSerif,
Monospaced, Dialog, DialogInput.
Nie sa˛ to czcionki wbudowane. Dla danej czcionki
logicznej dobierana jest ta czcionka systemowa, która
najlepiej pasuje do jednej z wymienionych rodzin.
Czcionka˛ domyślna˛ jest czcionka Dialog.
24 / 43
Biblioteka Swing – używanie czcionek
Wprowadzenie
do biblioteki
Swing
Agnieszka
Zbrzezny
Programowanie
w środowisku
graficznym
Biblioteka
Swing
Typy zdarzeń
niskiego
poziomu
Komponenty
Swing
interfejsu
użytkownika
Aby użyć określonej czcionki należy utworzyć obiekt
klasy Font z pakietu java.awt.
Konstruktor klasy Font przyjmuje trzy argumenty:
pierwszy z nich określa nazwe˛ rodziny czcionek,
drugi styl czcionki, natomiast trzeci jej wielkość.
Styl czcionki ustalamy, posługujac
˛ sie˛ stałymi z klasy
Font. Do dyspozycji mamy trzy różne wartości:
Font.BOLD – czcionka pogrubiona,
Font.ITALIC – czcionka pochylona,
Font.PLAIN – czcionka zwyczajna.
Example
Program 007: ListFonts.java
Program 008: FontTest.java
25 / 43
Biblioteka Swing – wyświetlanie obrazów
Wprowadzenie
do biblioteki
Swing
Agnieszka
Zbrzezny
Programowanie
w środowisku
graficznym
Biblioteka
Swing
Typy zdarzeń
niskiego
poziomu
Komponenty
Swing
interfejsu
użytkownika
Wczytywanie obrazu z dysku lokalnego
String filename = ...;
Image image = ImageIO.read(new
File(filename));
Wczytywanie obrazu z adresu URL
String urlname = ...;
Image iamge = ImageIO.read(new URL(urlname));
Wyświetlanie obrazu przy użyciu metod klasy Graphics
public abstract boolean drawImage(
Image img, int x, int y, ImageObserver o)
public abstract void copyArea(int x, int
y,
int width, int height, int dx, int dy)
Example
Program 009: ImageTest.java
26 / 43
Biblioteka Swing – obsługa zdarzeń
Wprowadzenie
do biblioteki
Swing
Agnieszka
Zbrzezny
Programowanie
w środowisku
graficznym
Biblioteka
Swing
Typy zdarzeń
niskiego
poziomu
Komponenty
Swing
interfejsu
użytkownika
Zdarzenia, takie jak naciśniecie
˛
klawisza lub przycisku
myszy, przytrafiaja˛ sie˛ obiektom. Źródło zdarzenia to
obiekt, któremu przytrafiło sie˛ zdarzenie.
Słuchacz to obiekt klasy implementujacej
˛ interfejs
nasłuchu (ActionListener).
Źródło zdarzenia może zarejestrować słuchacza i
wysyłać mu obiekty zdarzeń.
Źródło zdarzenia rozsyła obiekty zdarzeń do wszystkich
zarejestrowanych przez siebie słuchaczy.
Obiekty słuchaczy używaja˛ informacji zawartej w
obiektach zdarzeń do określenia reakcji na zdarzenie.
Example
Program 010: ButtonTest.java
27 / 43
Powiadamianie o zdarzeniu
Wprowadzenie
do biblioteki
Swing
Agnieszka
Zbrzezny
Programowanie
w środowisku
graficznym
Biblioteka
Swing
Typy zdarzeń
niskiego
poziomu
Komponenty
Swing
interfejsu
użytkownika
28 / 43
Uwagi
Wprowadzenie
do biblioteki
Swing
Agnieszka
Zbrzezny
Programowanie
w środowisku
graficznym
Biblioteka
Swing
Typy zdarzeń
niskiego
poziomu
Komponenty
Swing
interfejsu
użytkownika
29 / 43
Interfejs ActionListener użyty w programie
ButtonTest.java nie jest ograniczony do kliknieć
˛
w przyciski. Jest on używany w wielu innych
sytuacjach:
Kiedy poprzez podwójne klikniecie
˛
wybierana jest
pozycja z listy wyboru.
Kiedy wybierana jest pozycja z menu.
Kiedy naciśniety
˛ został klawisz ENTER w polu
tekstowym.
Kiedy upłynał˛ określony kwant czasu dla komponentu
Timer.
W każdym z tych przypadków metoda
actionPerformed (jedyna metoda interfejsu
ActionListener) otrzymuje obiekt klasy
ActionEvent jako argument. Obiekt ten zawiera
informacje o zaistniałym zdarzeniu.
Wykorzystanie klas anonimowych
Wprowadzenie
do biblioteki
Swing
Agnieszka
Zbrzezny
Programowanie
w środowisku
graficznym
Biblioteka
Swing
Typy zdarzeń
niskiego
poziomu
Komponenty
Swing
interfejsu
użytkownika
W programie ButtonTest.java tworzone sa˛ trzy
przyciski. Dla każdego przycisku wykonuje sie˛
nastepuj
˛ ace
˛ czynności:
Utworzenie przycisku z etykieta.
˛
Dodanie przycisku do panelu.
Utworzenie słuchacza z odpowiednim kolorem.
Dodanie tego słuchacza do przycisku.
Dlatego można utworzyć pomocnicza˛ metode˛
makeButton obejmujac
˛ a˛ te czynności, a w
konstruktorze wywołać ja˛ dla każdego przycisku.
Example
Program 011: BetterButtonTest.java
30 / 43
Wykorzystanie wewnetrznych
˛
klas
anonimowych
Wprowadzenie
do biblioteki
Swing
Agnieszka
Zbrzezny
Programowanie
w środowisku
graficznym
Biblioteka
Swing
Typy zdarzeń
niskiego
poziomu
Komponenty
Swing
interfejsu
użytkownika
Dodatkowo, ze wzgledu
˛
na to, że klasa ColorAction
jest potrzebna tylko raz (w metodzie makeButton),
można zrobić z tej klasy klase˛ anonimowa.
˛
Upraszcza to w pewnym stopniu kod metody
słuchacza.
Zauważmy, że metoda actionPerformed odwołuje
sie˛ do argumentu metody makeButton o nazwie
colorBackground.
Dlatego, podobnie jak wszystkie lokalne zmienne
wykorzystywane w klasie wewnetrznej,
˛
argument
metody makeButton musi być zadeklarowany jako
final.
Example
Program 012: TheBestButtonTest.java
31 / 43
Program 013: PlafTest.java
Hierarchia zdarzeń w bibliotece AWT
Wprowadzenie
do biblioteki
Swing
Agnieszka
Zbrzezny
Programowanie
w środowisku
graficznym
Biblioteka
Swing
Typy zdarzeń
niskiego
poziomu
Komponenty
Swing
interfejsu
użytkownika
32 / 43
Hierarchia zdarzeń w bibliotece AWT
Wprowadzenie
do biblioteki
Swing
Powszechnie używane typy zdarzeń z biblioteki AWT:
Agnieszka
Zbrzezny
Programowanie
w środowisku
graficznym
Biblioteka
Swing
Typy zdarzeń
niskiego
poziomu
Komponenty
Swing
interfejsu
użytkownika
33 / 43
ActionEvent
ItemEvent
MouseWheelEvent
AdjustmentEvent
KeyEvent
WindowEvent
FocusEvent
MouseEvent
Interfejsy nasłuchu tych zdarzeń to:
ActionListener
FocusListener
KeyListener
MouseMotionListener
WindowListener
WindowStateListener
AdjustmentListener
ItemListener
MouseListener
MouseWheelListener
WindowFocusListener
Hierarchia zdarzeń w bibliotece AWT
Wprowadzenie
do biblioteki
Swing
Agnieszka
Zbrzezny
Programowanie
w środowisku
graficznym
Biblioteka
Swing
Typy zdarzeń
niskiego
poziomu
Komponenty
Swing
interfejsu
użytkownika
34 / 43
Dla tych z powyższych interfejsów, które deklaruja˛
wiecej
˛
niż jedna˛ metode˛ istnieja˛ klasy adaptacyjne
implementujace
˛ puste metody dla tych interfejsów. Do
najcz˛eściej używanych klas adaptacyjnych należa:
˛
FocusAdapter
KeyAdapter
MouseAdapter
MouseMotionAdapter
WindowAdapter
Dla interfejsów nasłuchu deklarujacych
˛
jedna˛ metode˛
nie istnieja˛ klasy adaptacyjne implementujace
˛ te
interfejsy, ponieważ ich istnienie nie dawałoby żadnych
korzyści.
Klasy zdarzeń w bibliotece AWT
Wprowadzenie
do biblioteki
Swing
Agnieszka
Zbrzezny
Biblioteka AWT czyni użyteczne rozróżnienie pomiedzy
˛
zdarzeniami semantycznymi a zdarzeniami niskiego
poziomu.
Programowanie
w środowisku
graficznym
Zdarzenia semantyczne to zdarzenia opisujace
˛ co robi
użytkownik, np. klikniecie
˛
mysza˛ w przycisk.
Biblioteka
Swing
Zdarzenia niskiego poziomu to zdarzenia, które
umożliwiaja˛ takie działania użytkownika, np.
naciśniecie
˛
klawisza myszki, poruszanie myszka,
˛
zwolnienie przycisku myszki (o ile zwolnienie to
nastapiło
˛
w obszarze przycisku).
Typy zdarzeń
niskiego
poziomu
Komponenty
Swing
interfejsu
użytkownika
Innym przykładem zdarzenia niskiego poziomu jest np.
naciśniecie
˛
klawisza ENTER, o ile wcześniej dany
przycisk został wybrany przy pomocy klawisza TAB a
nastepnie
˛
aktywowany przy pomocy klawisza spacji.
35 / 43
Przykłady zdarzeń semantycznych
Wprowadzenie
do biblioteki
Swing
Agnieszka
Zbrzezny
Programowanie
w środowisku
graficznym
Biblioteka
Swing
Typy zdarzeń
niskiego
poziomu
Komponenty
Swing
interfejsu
użytkownika
36 / 43
Najcz˛eściej używane zdarzenia semantyczne to:
ActionEvent – klikniecie
˛
przycisku, wybór elementu
menu, wybór elementu listy, naciśniecie
˛
klawisza
ENTER w polu tekstowym
AdjustmentEvent – przesuniecie
˛
suwaka
ItemEvent – wybór jednego z wielu pór wyboru
Pieć
˛ klas zdarzeń niskiego poziomu to:
KeyEvent – klawisz klawiatury wciśniety
˛ lub zwolniony
MouseEvent – klawisz myszki został naciśniety
˛ lub
zwolniony, myszka została przesunieta
˛ z wciśnietym
˛
lub
zwolnionym klawiszem
MouseWheelEvent – rolka myszy została obrócona
FocusEvent – komponent został aktywowany lub
zdezaktywowany
WindowEvent – okno zostało aktywowane,
zdezaktywowane, wysłane do paska zadań,
przywrócone na ekran lub zamkniete
˛
Podsumowanie delegacyjnego modelu zdarzeń
Wprowadzenie
do biblioteki
Swing
Agnieszka
Zbrzezny
Programowanie
w środowisku
graficznym
Biblioteka
Swing
Typy zdarzeń
niskiego
poziomu
Komponenty
Swing
interfejsu
użytkownika
37 / 43
Źródłami zdarzeń sa˛ elementy interfejsu użytkownika,
okna oraz menu.
System operacyjny powiadamia źródło zdarzenia
o interesujacych
˛
je zachowaniach.
Źródło opisuje nature˛ danego zdarzenia używajac
˛ do
tego celu obiektu zdarzenia. Posiada ono również liste˛
słuchaczy – obiektów, które należy wywołać, gdy
nastapi
˛ dane zdarzenie.
Nastepnie
˛
źródło zdarzenia wywołuje odpowiednia˛
metode˛ interfejsu nasłuchu aby powiadomić o
zdarzeniu słuchaczy zainteresowanych danym
zdarzeniem. Robi to przekazujac
˛ obiekt zdarzenia do
metody z klasy słuchacza.
Obiekt słuchacza analizuje obiekt zdarzenia w celu
uzyskania informacji o zdarzeniu.
Zdarzenia dotyczace
˛ klawiatury
Wprowadzenie
do biblioteki
Swing
Agnieszka
Zbrzezny
Programowanie
w środowisku
graficznym
Biblioteka
Swing
Typy zdarzeń
niskiego
poziomu
Komponenty
Swing
interfejsu
użytkownika
Gdy użytkownik wciska klawisz generowane jest
zdarzenie KeyEvent z wartościa˛ id równa˛
KEY_PRESSED, a gdy zwalnia klawisz generowane jest
zdarzenie KeyEvent z wartościa˛ id równa˛
KEY_RELEASED.
Zdarzenia te można przechwytywać przy pomocy
metod keyPressed oraz keyReleased z dowolnej
klasy implementujacej
˛ interfejs KeyListener.
Trzecia metoda, keyTyped, łaczy
˛
działanie dwóch
powyższych – zwraca informacje˛ o znaku
wygenerowanym przez naciśniecie
˛
danego klawisza.
Java czyni rozróżnienie pomiedzy
˛
znakami a
wirtualnymi kodami klawiszy. Wirtualne kody klawiszy
oznaczane sa˛ prefiksem VK, np. VK_A lub V_SHIFT.
38 / 43
Zdarzenia dotyczace
˛ klawiatury
Wprowadzenie
do biblioteki
Swing
Agnieszka
Zbrzezny
Programowanie
w środowisku
graficznym
Biblioteka
Swing
Typy zdarzeń
niskiego
poziomu
Komponenty
Swing
interfejsu
użytkownika
39 / 43
Załóżmy, że użytkownik w zwykły sposób wpisuje duża˛
litere˛ A, tzn. naciska klawisze SHIFT oraz A
jednocześnie. Wygenerowanych zostanie wówczas
pieć
˛ zdarzeń niskiego poziomu.
Zdarzenia te oraz odpowiadajace
˛ im akcje to:
został naciśniety
˛ klawisz SHIFT – wywołanie metody
keyPressed dla VK_SHIFT
został naciśniety
˛ klawisz A – wywołanie metody
keyPressed dla VK_A
zostało wpisane A – wywołanie metody keyTyped dla A
został zwolniony klawisz A – wywołanie metody
keyReleased dla VK_A
został zwolniony klawisz SHIFT – wywołanie metody
keyReleased dla VK_SHIFT
Zdarzenia dotyczace
˛ klawiatury
Wprowadzenie
do biblioteki
Swing
Agnieszka
Zbrzezny
Programowanie
w środowisku
graficznym
Biblioteka
Swing
Typy zdarzeń
niskiego
poziomu
Komponenty
Swing
interfejsu
użytkownika
Załóżmy, że użytkownik w zwykły sposób wpisuje mała˛
litere˛ a, tzn. naciska klawisz A. Wygenerowane zostana˛
wówczas tylko trzy zdarzenia niskiego poziomu.
Zdarzenia te oraz odpowiadajace
˛ im akcje to:
został naciśniety
˛ klawisz A – wywołanie metody
keyPressed dla VK_A
zostało wpisane A – wywołanie metody keyTyped dla A
został zwolniony klawisz A – wywołanie metody
keyReleased dla VK_A
Mnemoniki dla wirtualnych kodów klawiszy
zdefiniowane sa˛ w klasie KeyEvent.
Example
Program 014: ActionTest.java
Program 015: Sketch.java
40 / 43
Zdarzenia dotyczace
˛ myszki
Wprowadzenie
do biblioteki
Swing
Agnieszka
Zbrzezny
Programowanie
w środowisku
graficznym
Biblioteka
Swing
Typy zdarzeń
niskiego
poziomu
Komponenty
Swing
interfejsu
użytkownika
Nie ma potrzeby, aby programista obsługiwał
niskpoziomowe zdarzenia zwiazane
˛
z myszka˛
gdy jest ona używana np. do wyboru pozycji
z listy lub z menu.
Zdarzenia te sa˛ obsługiwane przez różne komponenty
interfejsu użytkownika i przekształcane sa˛ na zdarzenia
semantyczne.
Jednakże, jeżeli programista chciałby użytkownikowi
swojego programu umożliwić rysowanie przy pomocy
myszki, to wtedy musi obsługiwać niskpoziomowe
zdarzenia zwiazane
˛
z myszka.
˛
Example
Program 016: MouseTest.java
41 / 43
Komponenty Swing interfejsu użytkownika
Wprowadzenie
do biblioteki
Swing
Agnieszka
Zbrzezny
Programowanie
w środowisku
graficznym
Biblioteka
Swing
Typy zdarzeń
niskiego
poziomu
Komponenty
Swing
interfejsu
użytkownika
42 / 43
Wprowadzanie tekstu
Pola tekstowe
Walidacja danych
Pola haseł
Obszary tekstowe
Etykiety i komponenty etykiet
Wybór tekstu
Edycja tekstu
Dokonywanie wyborów
Pola wyboru
Przełaczniki
˛
Krawedzie
˛
Listy kombinowane
Suwaki
Komponenty Swing interfejsu użytkownika
Wprowadzenie
do biblioteki
Swing
Agnieszka
Zbrzezny
Programowanie
w środowisku
graficznym
Biblioteka
Swing
Typy zdarzeń
niskiego
poziomu
Komponenty
Swing
interfejsu
użytkownika
43 / 43
Menu
Tworzenie menu
Ikony elementów menu
Pola wyboru i przełaczniki
˛
jako elementy menu
Menu kontekstowe
Mnemoniki i akceleratory
Właczanie
˛
i wyłaczanie
˛
elementów menu
Paski narz˛edzi
Podpowiedzi
Okna dialogowe
Okna wyboru
Tworzenie okien dialogowych
Przesyłanie danych
Okno pliku
Okno wyboru koloru

Podobne dokumenty