Programowanie GUI
Transkrypt
Programowanie GUI
Programowanie graficznego interfejsu użytkownika Wykład 8 Maciej Wołoszyn mailto:[email protected]∗ 10 maja 2006 Spis treści 1 JFC/Swing 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 1.10 1.11 1.12 1.13 1 Prosty przykład . . . . . . . . . . . . . . . . . . . . Swing i AWT . . . . . . . . . . . . . . . . . . . . . Podstawowe klasy okien . . . . . . . . . . . . . . . Przykładowe komponenty . . . . . . . . . . . . . . . Dodawanie komponentów do obiektu macierzystego Bezpieczeństwo watków ˛ . . . . . . . . . . . . . . . Rozmieszczanie komponentów . . . . . . . . . . . . Usuwanie komponentów . . . . . . . . . . . . . . . Aplety . . . . . . . . . . . . . . . . . . . . . . . . . Tworzenie apletu . . . . . . . . . . . . . . . . . . . Umieszczanie apletu na stronie WWW . . . . . . . . Appletviewer . . . . . . . . . . . . . . . . . . . . . Cykl życia apletu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 2 3 3 3 3 4 7 8 8 8 9 10 1 JFC/Swing • JFC (Java Foundation Classes) – biblioteka klas Javy zawierajaca ˛ m.in.: – komponenty GUI (Swing) ∗ Prosz˛ e o przesyłanie na ten adres informacji o znalezionych bł˛edach, literówkach oraz propozycji zmian i uzupełnień. Dokument przygotowano za pomoca˛ 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 moga˛ być wykorzystywane zarówno w aplikacjach, jak i w apletach (programach osadzonych w przegladarce ˛ 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); f.setVisible(true); } } • program musi si˛e 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˛edzi obsługujacych ˛ 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˛ecie 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˛e validate() 1.6 Bezpieczeństwo watków ˛ • w przeciwieństwie do AWT używajac ˛ pakietu Swing można dość łatwo zapewnić poprawność działania programów wielowatkowych ˛ Programowanie GUI – Wykład 8 4 • w tym celu do tworzenia lub modyfikowania elementów GUI zaleca si˛e 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˛e zwykle bezpośrednio do okienka, ale do zawartego w nim kontenera zwracanego przez metod˛e 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); Container c = f.getContentPane(); c.add(new JLabel("Napis JLabel")); f.setSize(300,100); f.setVisible(true); } }); } } • 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ć wykorzystujac ˛ tzw. menedżer układu (Layout Manager) wybierany metoda˛ setLayout, np. – 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"); Container c = f.getContentPane(); c.setLayout(new FlowLayout()); c.add(new JLabel("Napis JLabel")); c.add(new JButton("OK")); f.pack(); f.setVisible(true); JFrame f = new JFrame("BorderLayout"); Container c = f.getContentPane(); 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); f.setVisible(true); Programowanie GUI – Wykład 8 6 • kolejne menedżery: – BoxLayout oraz ułatwiajacy ˛ jego użycie kontener Box – układanie komponentów w pionie lub w poziomie – GridLayout – ułożenie na sieci prostokatnej ˛ JFrame f = new JFrame("Box"); Container c = f.getContentPane(); 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"); Container c = f.getContentPane(); 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); f.setVisible(true); • bardziej złożone układy elementów GUI można tworzyć posługujac ˛ si˛e panelami JPanel (również korzystajacymi ˛ z menedżerów układu, domyślnie jest to FlowLayout), do których dodaje si˛e poszczególne komponenty JFrame f = new JFrame("GridLayout+Panel"); Container c = f.getContentPane(); 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 przegladarki ˛ internetowej (która musi w tym celu obsługiwać j˛ezyk Java) • maja˛ działanie ograniczone wzgl˛edami bezpieczeństwa: brak dost˛epu do danych na lokalnym dysku (ale dost˛epny jest również mechanizm cyfrowych podpisów dla apletów) • brak problemów z instalacja˛ programu-klienta 1.10 Tworzenie apletu • wymaga utworzenia klasy dziedziczacej ˛ 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˛e pakowanie apletów i towarzyszacych ˛ 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 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 podglad ˛ apletu: $ appletviewer plik.html → 9 Programowanie GUI – Wykład 8 10 • appletviewer w pliku ignoruje wszystko poza znacznikiem <APPLET>, wi˛ec nie trzeba nawet tworzyć pliku HTML do podgladu ˛ apletu – wystarczy w pliku źródłowym umieścić w komentarzu lini˛e taka˛ 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˛e niektóre lub wszystkie z nast˛epujacych ˛ metod klasy Applet: – init() – automatycznie uruchamiana tylko raz: gdy aplet jest po raz pierwszy ładowany przez przegladark˛ ˛ e, – start() – wywoływana za każdym razem, gdy przegladarka ˛ wyświetla stron˛e z apletem, – stop() – uruchamiana gdy przegladarka ˛ przechodzi na inna˛ stron˛e; 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˛esto służa˛ do tworzenia, uruchamiania oraz zatrzymywania watkó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 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(); f.setVisible(true); } } 11