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