Java Foundation Clases
Transkrypt
Java Foundation Clases
Java Foundation Clases Tworzenie graficznych interfejsów użytkownika (GUI) w Javie Jacek Starzyński, IETiSIP PW, 2006 Tematyka: Co to jest JFC? Swing – zadania i struktura Szkielet programu Model zdarzeń Aplety Programowanie wizualne - Java Beans Wykorzystanie Netbeans JFC – co to jest? Java Foundation Classes (JFC) to zbiór bibliotek klas języka Java, stanowiący część Java 2 Platform Standard Edition (J2SE) i mający stanowić podstawę do tworzenia graficznych interfejsów użytkownika (GUI) przenośnych pomiędzy platformami Linux, MS Windows i Mac OSX. 1996 Internet FC Netscape + SUN => JFC przedstawiono na konferencji JavaOne w 1997 JFC składa się z biblioteki AWT biblioteki Java 2 Swing biblioteki Java 2D API. Dodatkowymi wyróżniającymi cechami są: dostosowywanie wyglądu komponentów przez PLAF, mechanizm DAD, wspomaganie tworzenia aplikacji dla osób upośledzonych i wspomaganie internacjonalizacji aplikacji. Swing Swing jest obiektową biblioteką komponentów do tworzenia GUI (GUI toolkit) Swing jest napisany w Javie, a więc w pełni przenośny Swing symuluje wygląd widgetów podobny do widgetów środowiska, w którym działa (PLAF) Swing jest częścią J2SE, czyli podstawowego API dla wszystkich programów w Javie Komponenty Swing Poprawione AWT ● ● ● ● ● ● ● ● ● ● ● ● ● etykiety (labels) pola tekstowe (text fields) przyciski (buttons) pola opcji (check boxes) pola wyboru (radio buttons) rozwijane listy wyboru (combo boxes) listy (lists) pola tekstowe (text areas) suwaki (scroll panes and scroll bars) panele (panels) ramki (frames) pola dialogowe (dialogs) menu (menus and menu bars) Nowe ● ● ● ● ● ● ● ● ● ● ● ● ● ● podpowiedzi (tool tips) potencjometry (sliders) tabele (tables) drzewa (trees) style tekstu (styled text areas) paski postepu (progress bars) listy wyboru (spinners) od 1.4 formatowane pola tekstowe (formatted text fields) od 1.4 dialogi wyboru koloru (color choosers) dialogi wyboru pliku (file choosers) pola stowarzyszone (split panes) panele pól (tabbed panes) ramki wewnętrzne (internal frames) warstwy (layered panes) Pakiety Swing 17 pakietów publicznych ● javax.swing ● javax.accessibility ● javax.swing.plaf ● javax.swing.text.html ● javax.swing.plaf.basic ● javax.swing.text.parser ● javax.swing.border ● javax.swing.plaf.metal ● javax.swing.text.rtf ● javax.swing.colorchooser ● javax.swing.plaf.multi ● javax.swing.tree ● javax.swing.event ● javax.swing.table ● javax.swing.undo ● javax.swing.filechooser ● javax.swing.text Swing jest dużą biblioteką. W ramach tych zajęć zorientujemy się w ogólnych jego koncepcjach, ale nie jest możliwe omawianie tu wszystkich detali, a nawet wszystkich komponentów. Nazwy pakietów pozwalają łatwo zorientowac się w ich zawartości. Swing jest konsekwentnym, dobrze zaprojektowanym modelem programowania GUI. Do tworzenia aplikacji Swing bardzo pomocne jest wykorzystanie narzędzi graficznych. Zdecydowanie przyspieszają one projektowanie wyglądu aplikacji. Swing umożliwia uzyskanie czytelnego kodu nawet przy pomocy takich narzędzi. Najprostszy(?) program import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.SwingUtilities; Dawniej: frame.addWindowListener( new WindowAdapter() { public void windowClosing( WindowEvent e) { System.exit(0); } }); public class HelloSwing { } public static void main(String[] args) { Runnable r = new Runnable() { public void run() { JFrame frame = new JFrame(); frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); frame.add(new JLabel("Hello, Swing!")); // <1.5: frame.getContentPane().add(...) frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } }; SwingUtilities.invokeLater( r ); } Przykład: HelloSwing Zdarzenia Źródło (np. Komponent) Zdarzenie Odbiorca import javax.swing.JFrame; import javax.swing.JButton; import javax.swing.SwingUtilities; import java.awt.*; import java.awt.event.*; public final class EventIntro { public static void main(String[] args) throws Exception { SwingUtilities.invokeLater( new Runnable() { public void run() { final JFrame frame = new JFrame(); frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); JButton cb= new JButton("Close"); cb.addActionListener( new ActionListener() { public void actionPerformed( ActionEvent E ) { frame.dispose(); System.exit(0); } } ); frame.add(cb); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } } ); } Przykład: EventIntro } Odbiorcy zdarzeń Definicja class Closer implements ActionListener() { public void actionPerformed( ActionEvent E ) { frame.dispose(); System.exit(0); } } Użycie ... element.addActionListener( new Closer() ); ... Odbiorcy zdarzeń cb.addMouseListener( new MouseAdapter() { public void mouseEntered( MouseEvent e ) { Źródło (np. Komponent) cb.setText("Don't click me!"); cb.repaint(); } public void mouseExited( MouseEvent e ) { Odbiorca cb.setText("Uffffffffff!"); cb.repaint(); new Thread( Odbiorca new Runnable() { public void run() { try { Źródło Odbiorca Thread.sleep( 2000 ); (np. Komponent) } catch( Exception x ) {} cb.setText("Don't touch me!"); cb.repaint(); } cb.addActionListener( new ActionListener() { }).start(); public void actionPerformed( ActionEvent E ) { } frame.dispose(); } ); System.exit(0); } } ); Przykład: EventMulti Applety ● ● ● Applet (aplet) to prawie-program, który działa w otoczeniu innego programu (najczęściej przeglądarki internetowej). Określenie zostało wprowadzone w języku AppleScript (Apple, Mac OS, 1993), ale spopularyzowane przez applety Javy (Sun, 1995). Applety Javy służą przede wszystkim do bezpiecznego sieciowego programowania po stronie klienta. Przykład: Applet1 Applety // <applet code=Applet1 width=100 height=30></applet> import javax.swing.*; import java.awt.*; import java.awt.event.*; public class Applet1 extends JApplet { public void init() { final JTextField c= new JtextField( "Enter your name here and press <ENTER>"); c.addActionListener( new ActionListener() { public void actionPerformed( ActionEvent e ) { c.setText("Hello " + ((JTextField)e.getSource()).getText()+", nice to meet you!"); } } ); getContentPane().add( c ); } } Komunikacja apletu z otoczeniem Otoczenie appletu przesyła mu szereg komunikatów, czyli wywołujemetody appletu. Najwazniejsze z nich to: – – – – – init() - wywoływana po ładowaniu appletu, start() - wywoływana za każdym razem, gdy applet staje się widoczny, stop() - wywoływana, gdy applet staje się niewidoczny, destroy() - wywoływana, gdy applet jest usuwany z przeglądarki paint() - wywoływana w celu przerysowania appletu Przykład: Applet2 i appletviewer Ograniczenia GUI appletu ● Applet działa w oknie innego programu: – kolor tła może się różnić – może być konieczne wywołanie validate() aby komponety stały się widoczne. ● Applet ma wielkość określaną przez przeglądarkę. ● Applet (JApplet) jest podklasą java.awt.Panel. ● ● Kod appletu (i jego składników) jest ładowany z sieci, co może być dość wolne. URL kodu appletu i jego dokumentu są wykorzystywane do dostępu do innych składników (dźwięków, obrazków,..) Przykład: ShowMethods Bezpieczeństwo ● ● ● ● ● ● Applety nie mogą doładowywać bibliotek, ani definiować metod natywnych. Mogą używać tylko własnego kodu i API dostarczanego przez przeglądarkę: przyjmuje się, że przeglądarka powinna dostarczać min. pakietów java.* Applety nie powinny “dotykać” lokalnego dysku. Mogą natomiast dostawać się do plików poprzez pełny URL. Applety mogą łączyć się co najwyżej z własnym serwerem (obchodzi się to przez komunikację za pośr. serwera). Applet nie powinien uruchamiać żadnych programów po stronie klienta. Applet nie powinien sprawdzać niektórych zmiennych systemowych klienta. Okna otwierane przez applet wyglądają inaczej, niż własne okna klienta. Programowanie wizualne ● ● ● ● ● ● ● ● Visual Basic Borland Delphi Java Netbeans “Technologia” przeciągnij i upuść Bardzo wydajne: jedno z podstawowych narzędzi RAD Tworzenie GUI z gotowych komponentów Komponenty muszą być konfigurowalne Język obiektowy jest naturalnie wygodnym narzędziem do tworzenia komponentów Netbeans Netbeans