Java: otwórz okienko Programowanie w językach wysokiego poziomu mgr inż. Anna Wawszczak czwartek, 20 maja 2010 PLAN WYKŁADU • klasy wewnętrzne, lokalne i anonimowe • biblioteka AWT • zestaw Swing ➡ JFrame ➡ JPanel ➡ komponenty ➡ obsługa zdarzeń czwartek, 20 maja 2010 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. czwartek, 20 maja 2010 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 } czwartek, 20 maja 2010 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”. czwartek, 20 maja 2010 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.* czwartek, 20 maja 2010 NASZE PIERWSZE OKIENKO teoria Aby utworzyć puste okno należy: • zdefiniować • utworzyć klasę dziedziczącą po JFrame, obiekt tej klasy, • ustawić wielkość okna (domyślnie 0x0 pikseli), • określić zachowanie okna w momencie zamknięcia, • wyświetlić czwartek, 20 maja 2010 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. czwartek, 20 maja 2010 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 czwartek, 20 maja 2010 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 czwartek, 20 maja 2010 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); czwartek, 20 maja 2010 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); czwartek, 20 maja 2010 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. czwartek, 20 maja 2010 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);! ! } czwartek, 20 maja 2010 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. czwartek, 20 maja 2010 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() ); " } } ); czwartek, 20 maja 2010