Programowanie graficznego interfejsu użytkownika Wykład 8 Maciej Wołoszyn mailto:woloszyn@fatcat.ftj.agh.edu.pl 10 maja 2006 Spis treści 1 JFC/Swing 1 1.1 Prosty przykład................................. 2 1.2 Swing i AWT.................................. 2 1.3 Podstawowe klasy okien............................ 3 1.4 Przykładowe komponenty............................ 3 1.5 Dodawanie komponentów do obiektu macierzystego............. 3 1.6 Bezpieczeństwo wątków............................ 3 1.7 Rozmieszczanie komponentów......................... 4 1.8 Usuwanie komponentów............................ 7 1.9 Aplety...................................... 8 1.10 Tworzenie apletu................................ 8 1.11 Umieszczanie apletu na stronie WWW..................... 8 1.12 Appletviewer.................................. 9 1.13 Cykl życia apletu................................ 10 1 JFC/Swing JFC (Java Foundation Classes) biblioteka klas Javy zawierająca m.in.: komponenty GUI (Swing) Proszę o przesyłanie na ten adres informacji o znalezionych błędach, literówkach oraz propozycji zmian i uzupełnień. Dokument przygotowano za pomocą systemu LATEX. Prawa autorskie zastrzeżone. 1
Programowanie GUI Wykład 8 2 Java 2D API wsparcie dla drag-and-drop mechanizmy internacjonalizacji programów zbiór komponentów GUI o nazwie Swing zawarty jest w pakietach javax.swing.* obecny w Javie od wersji 1.2 komponenty Swing mogą być wykorzystywane zarówno w aplikacjach, jak i w apletach (programach osadzonych w przeglądarce internetowej) 1.1 Prosty przykład import javax.swing.*; public class P01 { public static void main(string[] args) { JFrame f = new JFrame("P01"); f.setdefaultcloseoperation( JFrame.EXIT_ON_CLOSE ); f.setsize(500,300); program musi się znajdować w pliku P01.java kompilacja: javac P01.java uruchomienie: java P01
Programowanie GUI Wykład 8 3 1.2 Swing i AWT Swing oparty jest (także relacjami dziedziczenia) na pierwotnym zestawie narzędzi obsługujących GUI w Javie od jej pierwszych wersji tzw. AWT (Abstract Window Toolkit) pakiety java.awt.* Przykład: java.lang.object java.awt.component java.awt.container java.awt.window java.awt.frame javax.swing.jframe 1.3 Podstawowe klasy okien JFrame pojedyncze okno aplikacji; rozwinięcie klasy Frame z AWT; JDialog okno dialogowe JApplet obszar apletu 1.4 Przykładowe komponenty JLabel etykieta tekstowa JLabel(String s) JButton przycisk JButton(String s) JTextField pole tekstowe JTextField(String s, int columns) JList lista JList(Object[] listdata) 1.5 Dodawanie komponentów do obiektu macierzystego poprzez wywołanie (dla obiektu na wyższym poziomie hierarchii) metody: add(component comp) jeśli dodajemy do pojemnika (ramki, panela itp), który już jest wyświetlony, to należy wywołać metodę validate() 1.6 Bezpieczeństwo watków w przeciwieństwie do AWT używając pakietu Swing można dość łatwo zapewnić poprawność działania programów wielowątkowych
Programowanie GUI Wykład 8 4 w tym celu do tworzenia lub modyfikowania elementów GUI zaleca się wykorzystanie konstrukcji: javax.swing.swingutilities.invokelater( new Runnable() { public void run(){ /*... */ ); 1.7 Rozmieszczanie komponentów elementów GUI z pakietu Swing nie dodaje się zwykle bezpośrednio do okienka, ale do zawartego w nim kontenera zwracanego przez metodę getcontentpane() import java.awt.*; import javax.swing.*; public class P10 extends JFrame{ public static void main(string[] args) { javax.swing.swingutilities.invokelater( new Runnable() { public void run() { JFrame f = new JFrame("P10"); f.setdefaultcloseoperation( JFrame.EXIT_ON_CLOSE); c.add(new JLabel("Napis JLabel")); ); f.setsize(300,100); metoda pack() powoduje automatyczne dopasowanie rozmiaru okna do preferowanych rozmiarów i rozmieszczenia komponentów
Programowanie GUI Wykład 8 5 sposób rozmieszczania elementów można zmieniać wykorzystując tzw. układu (Layout Manager) wybierany metodą setlayout, np. menedżer FlowLayout równomierne rozmieszczanie kolejno od lewej do prawej i od góry do dołu BorderLayout możliwość umieszczania elementów u góry, u dołu, po lewej, po prawej oraz w centrum, JFrame f = new JFrame("P11"); c.setlayout(new FlowLayout()); c.add(new JLabel("Napis JLabel")); c.add(new JButton("OK")); f.pack(); JFrame f = new JFrame("BorderLayout"); c.setlayout(new BorderLayout()); c.add(new JButton("Cancel"), BorderLayout.NORTH); c.add(new JLabel("Napis JLabel"));//CENTER c.add(new JButton("OK"), BorderLayout.SOUTH); f.setsize(300,200);
Programowanie GUI Wykład 8 6 kolejne menedżery: BoxLayout oraz ułatwiający jego użycie kontener Box układanie komponentów w pionie lub w poziomie GridLayout ułożenie na sieci prostokątnej JFrame f = new JFrame("Box"); c.setlayout(new BorderLayout()); Box b = Box.createHorizontalBox(); b.add(box.createhorizontalglue()); b.add(new JButton("OK")); b.add(box.createhorizontalglue()); b.add(new JButton("Cancel")); b.add(box.createhorizontalglue()); c.add(new JLabel("Napis JLabel")); c.add(b,borderlayout.south);
Programowanie GUI Wykład 8 7 JFrame f = new JFrame("GridLayout"); c.setlayout(new GridLayout(2,2)); c.add(new JButton("OK")); c.add(new JLabel("Napis JLabel")); c.add(new JButton("Cancel")); f.setsize(300,200); bardziej złożone układy elementów GUI można tworzyć posługując się panelami JPanel (również korzystającymi z menedżerów układu, domyślnie jest to FlowLayout), do których dodaje się poszczególne komponenty JFrame f = new JFrame("GridLayout+Panel"); c.setlayout(new GridLayout(2,2)); JPanel p = new JPanel(); p.add(new JButton("OK")); p.add(new JButton("Cancel")); c.add(new JLabel("JLabel 1")); c.add(p); c.add(new JLabel("JLabel 2")); f.pack();
Programowanie GUI Wykład 8 8 1.8 Usuwanie komponentów może być przydatne np. do zmiany ich zestawu i rozmieszczenia usuwanie komponentów jest możliwe z wykorzystaniem metody remove(component comp) konieczne może być odświeżenie zawartości (przydatne metody: validate i repaint()) 1.9 Aplety programy przeznaczone do działania w oknie przeglądarki internetowej (która musi w tym celu obsługiwać język Java) mają działanie ograniczone względami bezpieczeństwa: brak dostępu do danych na lokalnym dysku (ale dostępny jest również mechanizm cyfrowych podpisów dla apletów) brak problemów z instalacją programu-klienta 1.10 Tworzenie apletu wymaga utworzenia klasy dziedziczącej po klasie JApplet aplet nie potrzebuje metody main sposób obsługi elementów GUI, rysowania w oknie apletu itd. jest taki sam jak w przypadku aplikacji dla poprawy szybkości ładowania zaleca się pakowanie apletów i towarzyszących im danych w archiwa JAR import javax.swing.*; import java.awt.*; public class P19 extends JApplet { public void init() { JLabel jl = new JLabel("[APLET]"); getcontentpane().add(jl);
Programowanie GUI Wykład 8 9 1.11 Umieszczanie apletu na stronie WWW wymaga użycia znacznika <APPLET> w HTML-u <HTML> <HEAD><TITLE>Aplet P19</TITLE></HEAD> <BODY>Java applet <APPLET CODE="P19.class" WIDTH=100 HEIGHT=100></APPLET> </BODY> </HTML> 1.12 Appletviewer szybki podgląd apletu: $ appletviewer plik.html
Programowanie GUI Wykład 8 10 appletviewer w pliku ignoruje wszystko poza znacznikiem <APPLET>, więc nie trzeba nawet tworzyć pliku HTML do podglądu apletu wystarczy w pliku źródłowym umieścić w komentarzu linię taką jak np.: // <APPLET CODE="P19.class" WIDTH=100 HEIGHT=100><APPLET> i po skompilowaniu apletu uruchomić go poleceniem: $ appletviewer P19.java 1.13 Cykl życia apletu zwykle redefiniuje się niektóre lub wszystkie z następujących metod klasy Applet: init() automatycznie uruchamiana tylko raz: gdy aplet jest po raz pierwszy ładowany przez przeglądarkę, start() wywoływana za każdym razem, gdy przeglądarka wyświetla stronę z apletem, stop() uruchamiana gdy przeglądarka przechodzi na inną stronę; zwykle służy do zatrzymania kosztownych operacji (np. wyświetlania animacji), destroy() uruchamiana na koniec działania apletu (wcześniej zostanie wywołana również stop()) metody start() i stop() często służą do tworzenia, uruchamiania oraz zatrzymywania wątków Przykład: aplet, który może działać również jako niezależna aplikacja // <applet code=p17 width=200 height=50></applet> import javax.swing.*; import java.awt.*; public class P17 extends JApplet {
Programowanie GUI Wykład 8 11 public void init() { Container c = getcontentpane(); c.setlayout(new FlowLayout()); c.add(new JButton("?")); public static void main(string[] args) { JApplet a = new P17(); JFrame f = new JFrame("Aplikacja"); f.getcontentpane().add(a); f.setsize(300,70); a.init(); a.start();