Java: otwórz okienko Programowanie w językach wysokiego poziomu mgr inż. Anna Wawszczak
PLAN WYKŁADU klasy wewnętrzne, lokalne i anonimowe biblioteka AWT zestaw Swing JFrame JPanel komponenty obsługa zdarzeń
NIETYPOWE KLASY wewnętrzne, lokalne i anonimowe Język Java dostarcza specjalne mechanizmy pozwalające definiować następujące typy klas: klasy wewnętrzne - definicja klasy wewnętrznej znajduje się wewnątrz definicji innej klasy, lokalne klasy wewnętrzne - definicja lokalnej klasy wewnętrznej znajduje się wewnątrz metody innej klasy, anonimowe klasy wewnętrzne - anonimowa klasa wewnętrzna definiowana jest podczas tworzenia obiektu tej klasy; tworzony jest tylko jeden jej obiekt; klasa anonimowa nie ma nazwy.
ANONIMOWE KLASY WEWNĘTRZNE nie ważne jak się nazywam, ważne co robię Składnia anonimowych klas wewnętrznych: new TypNadrzedny ( /* arumenty konstruktora typu nadrzędnego */ ) { " /* metody i pola składowe klasy anonimowej */ }; Wykorzystanie klas lokalnych i lokalnych anonimowych: public static void main(string[] args) { " /* klasa lokalna */" " class Osoba { " " String imie; String nazwisko; " " Osoba (String n, String i) { nazwisko = n; imie = i; } " " public String tostring() { return imie + " " + nazwisko; } " }; " /* utworzenie obiektu lokalnej klasy anonimowej dziedziczącej po lokalnej klasie Osoba */ " Osoba pracownik = new Osoba ( "Jas", "Fasolka" ) { /* wywołanie konstruktora klasy Osoba */ " /* definicja pól i metod rozszerzających funkcjonalność klasy Osoba */ " " String stanowisko = "Sprzedawca warzyw"; " " public String tostring() { return stanowisko + ": " + super.tostring(); } " }; " System.out.print(pracownik); // Sprzedawca warzyw: Fasolka Jas }
JAVA AWT czyli czego nie będziemy używać Abstract Window Toolkit - biblioteka do prostego programowania GUI (graficznego interfejsu użytkownika) bazująca na odpowiednikach. Aplikacje zachowują wygląd i wrażenie systemu operacyjnego, na którym są uruchomione (ta sama aplikacja uruchomiona na Windows z założenia powinna wyglądać jak natywna aplikacja Windowsowa, a uruchomiona np. na Mac OSX jak natywna aplikacja na Mac OSX) Poszczególne kontrolki są tworzone jako odpowiedniki przez wbudowane mechanizmy systemu operacyjnego. Biblioteka powodowała błędy na różnych platformach, przez co slogan firmy SUN dotyczący Javy zmienił się z Napisz raz, uruchamiaj wszędzie na Napisz raz, debuguj wszędzie.
SWING...aby okienka otwierały się łatwiej... Swing to zestaw narzędzi (biblioteka) GUI, który jest częścią Java Foundation Classes (JFC). Elementy interfejsu użytkownika są rysowane na powierzchni pustych okien. Jedyne wsparcie wymagane od systemu operacyjnego to utworzenie pustego okna i możliwość rysowania w nim. Swing posiada bogatszy i łatwiejszy w użyciu zestaw elementów interfejsu użytkownika. W bardzo małym stopniu zależy od platformy - mniej błędów związanych z niezgodnością z platformy. Aby wykorzystywać pakiet Swing należy zaimportować javax.swing.*
NASZE PIERWSZE OKIENKO teoria Aby utworzyć puste okno należy: zdefiniować klasę dziedziczącą po JFrame, utworzyć obiekt tej klasy, ustawić wielkość okna (domyślnie 0x0 pikseli), określić zachowanie okna w momencie zamknięcia, wyświetlić okno.
NASZE PIERWSZE OKIENKO praktyka class MojeOkienko extends JFrame{ " public MojeOkienko(){ " " /* ustawienie wysokości i szerokości */ " " setsize(szerokosc,wysokosc); " " /* ustawienie zachowania w momencie zamknięcia okienka */ " " this.setdefaultcloseoperation(exit_on_close); " } " public static final int SZEROKOSC = 300; /* pikseli */ " public static final int WYSOKOSC = 200; /* pikseli */ } public static void main(string[] args) { " MojeOkienko mo = new MojeOkienko(); " mo.show(); /* wyświetlenie okienka */ } Domyślnie okno znika w momencie gdy użytkownik je zamknie, ale program nie kończy swojego działania.
METODY KLASY JFrame czyli co możemy zrobić z okienkiem dispose() - zamyka okno i zwalnia zasoby systemu używane przy jego utworzeniu settitle(string) - ustawia tekst w pasku tytułowym okna setresizable(boolean) - określa czy użytkownik może zmieniać rozmiar ramki setlocation(int x, int y) - ustawia pozycję okna setbounds(int x, int y, int szerokosc, int wysokosc) - ustawia jednocześnie pozycję i wielkość okna
TOOLKIT przydatne narzędzia Toolkit to klasa pozwalająca na pobranie informacji zależnych od systemu, np. rozmiaru ekranu. import java.awt.*; Toolkit toolkit = Toolkit.getDefaultToolkit(); Dimension d = toolkit.getscreensize(); int szerokosc = d.width; int wysokosc = d.height; Zarówno klasa Toolkit jak i Dimension należą do AWT. Opis innych przydatnych metod udostępnianych przez klasę Toolkit można znaleźć w dokumentacji na stronie http://java.sun.com/j2se/1.4.2/docs/api/java/awt/toolkit.html
DODAWANIE KOMPONENTÓW czyli co zrobić, żeby okienko nie było puste Aby dodać do okna element interfejsu użytkownika należy dodać komponent do powierzchni zawartości tego okna: /* pobranie powierzchni zawartości */ Container powzawartosci = getcontentpane(); /* utworzenie komponentu */ Component k = /*... */; /* dodanie komponentu k do powierzchni zawartości */ powzawartosci.add(k);
PRZYWITAJMY SIĘ SWING ujące Hello World Aby wyświetlić napis należy dodać do powierzchni zawartości komponent JPanel i namalować na tym panelu napis. W tym celu należy: zdefiniować klasę rozszerzającą JPanel, przeładować metodę paintcomponent, utworzyć obiekt komponentu i dodać go do powierzchni. class PowitalnyPanel extends JPanel{ " int x; int y; " public PowitalnyPanel(int px, int py) { x = px; y = py; } " public void paintcomponent(graphics g){ " " g.drawstring("witaj w SWING'ującym świecie", x, y); /* narysowanie napisu */ " } } /* w jednej z metod klasy dziedziczącej po JFrame... */ Container powzawartosci = getcontentpane(); Component k = new PowitalnyPanel(10,20); powzawartosci.add(k);
DODAWANIE ELEMENTÓW INTERFEJSU UŻYTKOWNIKA Aby dodać elementy interfejsu użytkownika takie jak przyciski, pola tekstowe, należy: utworzyć obiekt komponentu (JTextField, JComboBox, JRadioButton), dodać komponent do panelu, w przypadku komponentów, które będą później wykorzystywane należy dodać do klasy okienka referencję do tego komponentu, która umożliwi modyfikację stanu komponentu.
PODSTAWOWE KOMPONENTY przycisk, etykieta i pole tekstowe class MojeOkienko extends JFrame {! JTextField poletekst; /* referencja do tekstu */! JPanel panel; /* referencja do panelu */! JLabel etykieta; /* referencja do etykiety */!! public void dodajkomponenty()! {!! Container powzawartosci = getcontentpane();!! panel = new JPanel(); /* utworzenie panelu */!! powzawartosci.add(panel); /* dodanie panelu do powierzchni zawartości */!!!! etykieta = new JLabel("Witamy w naszej aplikacji"); /* utworzenie etykiety */!! panel.add(etykieta); /* dodanie etykiety do panelu */!!!! JButton przycisk = new JButton("Przycisk"); /* utworzenie przycisku */!!!! panel.add(przycisk); /* dodanie przycisku do panelu */!! poletekst = new JTextField("Ala ma kotka", 20); /* utworzenie pola tekstowego */!! panel.add(poletekst); /* dodanie pola tekstowego do panelu */! }! public MojeOkienko(){!! dodajkomponenty();!! setsize(300,200);!! this.setdefaultcloseoperation(exit_on_close);!!! } }
OBSŁUGA ZDARZEŃ teoria W celu obsługi zdarzeń należy utworzyć klasę słuchacza implementującą interfejs ActionListener (pakiet java.awt.event) oraz zdefiniować w tej klasie metodę actionperformed. Dodać obiekt klasy słuchacza do komponentu za pomocą metody addactionlistener. Klasa słuchacza najczęściej jest implementowana jako klasa wewnętrzna, lokalna lub anonimowa.
OBSŁUGA ZDARZEŃ praktyka Wykorzystanie klasy lokalnej: class Słuchacz implements ActionListener { " public void actionperformed( ActionEvent e ) { " " etykieta.settext( poletekst.gettext() ); " } }" " przycisk.addactionlistener( new Słuchacz() ); Wykorzystanie klasy anonimowej: przycisk.addactionlistener( new ActionListener() { " public void actionperformed( ActionEvent e ) { " " etykieta.settext( poletekst.gettext() ); " } } );