Przygotował: Jacek Sroka 1 Programowanie obiektowe Swing
Przygotował: Jacek Sroka 2 GUI w Javie Abstract Window Toolkit (AWT) podstawowy zbiór komponentów opartych na zarządcy okien wspólny mianownik funkcjonalności ze wszystkich platform rozbudowany model obsługi zdarzeń klasy pomocnicze m.in. kształty, kolory i fonty zarządcy układu obsługa schowka
Przygotował: Jacek Sroka 3 GUI w Javie Swing to co w AWT plus Javowa implementacja komponentów z AWT rozbudowany zestaw komponentów zaimplementowanych w Javie tylko komponenty najwyższego poziomu są oparte na zarządcy okien ta sama funkcjonalność na wszystkich platformach przełączalny wygląd i zachowanie (pluggable look and feel) dość dobra ale nie idealna symulacja wyglądu zarządcy okien (nie korzysta z akceleracji)
Przygotował: Jacek Sroka 4 GUI w Javie c.d. Standard Widget Toolkit (SWT) zapoczątkowany przez IBMa, rozwijany w ramach platformy Eclipse opiera się na zarządcy okien tak ja AWT, ale nie ogranicza funkcjonalności gorsza przenośność aplikacji (WORE vs WOTE)
Przygotował: Jacek Sroka 5 import javax.swing.*; Przykład public class WitajSwiecie { private static void utwórzgui() { //tworzenie nowego okna JFrame frame = new JFrame("Okno WitajSwiecie"); frame.setdefaultcloseoperation(jframe.exit_on_close); //dodawanie etykiety z przywitaniem JLabel label = new JLabel("Witaj świecie!"); frame.add(label); } //ustalanie wymiarów i wyświetlanie okna //frame.pack(); //względem komponentów frame.setsize(300,150); frame.setvisible(true); } public static void main(string[] args) { //aby uniknąć zakleszczeń tworzenie GUI //zlecamy do wątku obsługi zdarzeń SwingUtilities.invokeLater(new Runnable() { public void run() { utwórzgui(); } }); }
Przygotował: Jacek Sroka 6 Podstawowe komponenty JLabel wyświetla tekst lub obrazek get/settext() get/seticon() get/sethorizontalalignment() get/setverticalalignment() get/setdisplayedmnemonic() mnemonic to podkreślona litera get/setlabelfor() komponent do którego zostanie przeniesiony focus po wybraniu Alt+mnemonic
Przygotował: Jacek Sroka 7 Podstawowe komponenty JButton podobnie jak etykieta (i inne komponenty) posiada get/settext(), get/seticon(), get/sethorizontalalignment(), get/setverticalalignment(), get/setdisplayedmnenomic() przycisk może zmieniać wygląd w zależności od swojego stanu get/setdisabledicon() get/setdisabledselectedicon() get/seticon() get/setpressedicon() get/setrollovericon() get/setrolloverselectedicon() get/setselectedicon() akcję dowiązujemy przy pomocy zdarzeń
Przygotował: Jacek Sroka 8 Podstawowe komponenty JTextField get/settext() JFrame kontener na inne komponenty łącznik do systemu operacyjnego (systemu okien) get/settitle() tytuł okienka get/setstate() minimalizacja/maksymalizacja is/setvisible() widoczność na ekranie get/setlocation() umiejscowienie na ekranie get/setsize() rozmiar add() dodanie komponentu
Przygotował: Jacek Sroka 9 Drugi przykład import javax.swing.*; public class AWitajŚwiecie extends JFrame { JLabel jlabel; JTextField jtextfield; JButton jbutton; public AWitajŚwiecie() { super(); this.setsize(300, 200); this.getcontentpane().setlayout(null); this.add(getjlabel(), null); this.add(getjtextfield(), null); this.add(getjbutton(), null); this.settitle("witajswiecie"); this.setvisible(true); }
Przygotował: Jacek Sroka 10 private javax.swing.jlabel getjlabel() { if(jlabel == null) { jlabel = new javax.swing.jlabel(); jlabel.setbounds(34, 49, 53, 18); jlabel.settext("imię:"); } return jlabel; } private javax.swing.jtextfield getjtextfield() { if(jtextfield == null) { jtextfield = new javax.swing.jtextfield(); jtextfield.setbounds(96, 49, 160, 20); } return jtextfield; } private javax.swing.jbutton getjbutton() { if(jbutton == null) { jbutton = new javax.swing.jbutton(); jbutton.setbounds(103, 110, 71, 27); jbutton.settext("ok"); } return jbutton; } public static void main(string[] args) { new AWitajŚwiecie(); }
Przygotował: Jacek Sroka 11 Problemy Bezwzględne rozmiary i współrzędne jak to będzie wyglądać na innych platformach? Jak zakończyć aplikację? DO_NOTHING_ON_CLOSE HIDE_ON_CLOSE (domyślne dla JDialog i JFrame) ukrywa okno DISPOSE_ON_CLOSE (domyślne dla JInternalFrame) ukrywa i zwalnia zasoby; jeżeli to było ostatnie okno to VM może zakończyć działanie EXIT_ON_CLOSE kończy aplikację przy pomocy System.exit(0) Czy rozszerzać JFrame i pamiętać komponenty jako atrybuty?
Przygotował: Jacek Sroka 12 Zarządcy układu BorderLayout używany domyślnie przez główne komponenty (JApplet, JDialog i JFrame) zmiana metodą setlayout(layoutmanager) rejony: prawo, lewo, góra, dół, środek (domyślnie) dodanie nowego komponentu do rejonu już posiadającego zawartość spowoduje jej podmianę FlowLayout układa komponenty od lewej do prawej dozwala komponentom na preferowany rozmiar, nawet jak nie będą przez to widoczne w całości
Przygotował: Jacek Sroka 13 Zarządcy układu c.d. GridLayout komponenty umieszczane są w komórkach siatki wszystkie komponenty mają taki sam rozmiar I wiele innych... BoxLayout wiersz lub kolumna (można zagnieżdżać) GridBagLayout duże możliwości, skomplikowany SpringLayout rozmieszczenie wyznaczone przez więzy (sprężyny z minimalną, maksymalną i optymalną długością) CardLayout przełączalne karty
Przygotował: Jacek Sroka 14 Zarządcy układu c.d.
Przygotował: Jacek Sroka 15 Jeszcze trochę komponentów JComboBox pozwala wybrać max 1 element additem() dodaje element do grupy get/setselectedindex() manipuluje stanem get/setselecteditem() zwraca/ustawia wybrany element removeallitems() usuwa wszystkie elementy removeitem() usuwa konkretny element JPasswordField podobny do JTextField get/setechochar() wyświetlany znak gettext() zwraca napis (przy heap dump teoretycznie można go odczytać) getpassword() zwraca char[]
Przygotował: Jacek Sroka 16 Jeszcze trochę komponentów c.d. JCheckBox i JRadioButton JRadioButton daje wykluczający się wybór add() dodaje checkbox lub przycisk do grupy getelements() zwraca wszystkie komponenty grupy do iteracji JOptionPane gotowiec do wyskakujących okienek
Przygotował: Jacek Sroka 17 Jeszcze trochę komponentów c.d. JMenu/JMenuItem/JMenuBar przy pomocy setjmenubar() ustawia się JMenuBar dla ramki JMenu zawiera JMenuItem lub inne JMenu JMenuItem się wybiera dla JMenuItem można ustawić skrót dla JMenu i JMenuItem można ustawiać mnemoniki Wspólne metody JMenuItem oraz jego podklasy JMenu: get/setaccelerator() ustawia skrót postaci Ctrl+klawisz get/settext() tekst wyświetlany w menu get/seticon() ikona wyświetlana w menu Metody JMenu: add() dodaje element lub podmenu
Przygotował: Jacek Sroka 18 Jeszcze trochę komponentów c.d. JSlider wygodne pobieranie wartości całkowitych z zadanego zakresu get/setminimum() get/setmaximum() get/setorientation() pion lub poziom get/setvalue() JSpinner umożliwia wybór z ciągu wartości, np. liczb, dat, kolorów (trochę podobny do JSlider i JComboBox) get/setvalue() początkowa wartość jako liczba całkowita getnextvalue() wartość po kliknięciu strzałki w górę getprevioudvalue() wartość po kliknięciu strzałki w dół
Przygotował: Jacek Sroka 19 Jeszcze trochę komponentów c.d. JToolBar pasek narzędziowy, może pływać działa jak paleta na inne komponenty is/setfloatable() JToolTip podpisy do wszystkich innych komponentów sami nie tworzymy tylko ustawiamy metodą settooltip()
Przygotował: Jacek Sroka 20 Jeszcze trochę komponentów c.d. JTextArea wieloliniowe pole tekstowe is/setlinewrap() czy załamywać linie is/setwrapstyleword() czy załamywać słowa JScrollPane przykład Dekoratora gethorizontalscrollbar() zwraca zawarty obiekty JScrollBar getverticalscrollbar() analogicznie get/sethorizontalscrollbarpolicy() Always, Never lub Needed get/setverticalscrollbarpolicy() analogicznie
Przygotował: Jacek Sroka 21 Jeszcze trochę komponentów c.d. JList podobna do JComboBox, ale umożliwia wybór wielu wartości najlepiej opakowywać w JScrollPane get/setselectedindex() indeks wiersza lub int[] get/setselectionmode() tryb wyboru setlistdata() dane dla listy aet/setselectedvalue() zaznaczony obiekt
Przygotował: Jacek Sroka 22 Jeszcze trochę komponentów c.d. JTable JTree
Przygotował: Jacek Sroka 23 Obsługa zdarzeń Wzorzec Obserwator (ang. Observer) Wydawca-Prenumerator (ang. Publish-Subscribe) Delegowanie obsługi zdarzeń (ang. Delegation Event Model) Konwencja nazewnicza addactionlistener(actionlistener) i removeactionlistener(actionlistener) actionperformed(actionevent) Kod obsługi zdarzeń wykonywany jest przez wątek koordynujący zdarzenia długotrwałe operacje zamulają interfejs można używać SwingUtilities.invokeLater() uwaga na zakleszczenia przy przebudowywaniu interfejsu z innego wątku
Przygotował: Jacek Sroka 24 public class ZliczanieKliknięć extends JFrame { Integer licznikkliknięć = 0; JLabel etykieta; class ZwiększanieLicznika implements ActionListener { public void actionperformed(actionevent e) { //obiekt klasy wewnętrznej ma dostęp do skład. obiektu klasy otaczającej licznikkliknięć++; etykieta.settext("dotychczas kliknąłeś " + licznikkliknięć + (licznikkliknięć == 1? " raz" : " razy")); } } ZliczanieKliknięć() { super("okno ZliczanieKliknięć"); setdefaultcloseoperation(jframe.exit_on_close); JPanel panel = new JPanel(); panel.setlayout(new GridLayout(3, 0)); JButton przycisk = new JButton("Kliknij"); przycisk.addactionlistener(new ZwiększanieLicznika()); panel.add(przycisk); etykieta = new JLabel("Jeszcze nie kliknięto ani razu"); panel.add(new JPanel());//pusty panel zapewnia odstęp panel.add(etykieta); //puste obramowanie odsuwa komponenty od krawędzi panel.setborder(borderfactory.createemptyborder(30,60,10,60)); add(panel); //...
Przygotował: Jacek Sroka 25 Najważniejsze rodzaje zdarzeń ActionListener kliknięcie przycisku, wybór pozycji z menu, zaakceptowanie wartości w polu tekstowym actionperformed(actionevent e) KeyListener obsługa klawiatury: wciśnięcie, puszczenie i kliknięcie klawisza istnieje klasa adapter KeyAdapter keypressed(keyevent e) keyreleased(keyevent e) keytyped(keyevent e)
Przygotował: Jacek Sroka 26 Najważniejsze rodzaje zdarzeń MouseListener obsługa myszki: wciśnięcie przycisku, puszczenie przycisku, kliknięcie, najechanie i opuszczenie istnieje klasa adapter MouseMotionListener mouseclicked(mouseevent e) mouseentered(mouseevent e) mouseexited(mouseevent e) mousepressed(mouseevent e) mousereleased(mouseevent e) MouseMotionListener wykrywanie ruchu kursora istnieje klasa adapter MouseMotionAdapter mousedragged(mouseevent e) mousemoved(mouseevent e)
Przygotował: Jacek Sroka 27 Najważniejsze rodzaje zdarzeń TextListener dotyczy komponentów rozszerzających JTextComponent (np. JTextArea i JTextField); zachodzi gdy zmienił się tekst textvaluechanged(textevent e) WindowListener aktywacja/dezaktywacja, minimalizacja/maksymalizacja, itp. istnieje klasa adapter WindowAdapter windowactivated(windowevent e) windowclosed(windowevent e) windowclosing(windowevent e) windowdeactivated(windowevent e) windowdeiconified(windowevent e) windowiconified(windowevent e) windowopened(windowevent e)
Przygotował: Jacek Sroka 28 Modele Zamiast żmudnie zarządzać danymi niektórych komponentów wygodniej podłączyć do nich model JComboBox jakie są możliwości wyboru i ile ich jest JSpinner co wyświetlić i jakie są poprzednie i wcześniejsze możliwości JList jaki tekst opisuje poszczególne możliwości wyboru JTable liczba kolumn i wierszy, ich etykiety, klasy kolumn, tekst każdej komórki JTree struktura drzewa
Przygotował: Jacek Sroka 29 Modele przykład super("okno ComboBoxModel"); setdefaultcloseoperation(jframe.exit_on_close); String[] data = {"Ala", "Ola", "Ela", "Ula"}; MyComboModel model = new MyComboModel(java.util.Arrays.asList(data)); JComboBox cb1 = new JComboBox(); JComboBox cb2 = new JComboBox(); cb1.setmodel(model); cb2.setmodel(model); setlayout(new FlowLayout()); add(cb1); add(cb2); setsize(300, 150); setvisible(true);
Przygotował: Jacek Sroka 30 Modele przykład c.d. class MyComboModel implements ComboBoxModel { private List data = new ArrayList(); private int selected = 0; public MyComboModel(List list) { data = list; } public void setselecteditem(object o) { selected = data.indexof(o); } public Object getselecteditem() { return data.get(selected); } public int getsize() { return data.size(); } public Object getelementat(int i) { return data.get(i); } public void addlistdatalistener(listdatalistener l) { //rejestruje listenery zainteresowane zmianami modelu } } public void removelistdatalistener(listdatalistener l) { //usuwa listenery zainteresowane zmianami modelu }
Przygotował: Jacek Sroka 31 Wygląd i zachowanie Standardowe podklasy LookAndFeel javax.swing.plaf.metal.metallookandfeel domyślne międzyplatformowe wygląd i zachowanie Javy; można go używać na każdej platformie, com.sun.java.swing.plaf.windows.windowslookandfeel wygląd i zachowanie symulujące te znane z systemu Windows; obecnie można ich używać tylko pod systemem Windows, com.sun.java.swing.plaf.motif.motiflookandfeel wygląd i zachowanie CDE/Motif; domyślne na systemach firmy SUN; można go używać na każdej platformie, com.sun.java.swing.plaf.gtk.gtklookandfeel wygląd i zachowanie GTK+ (nie jest dostępny w wszystkich wersjach JRE). wiele innych na http://www.javootoo.com/
Przygotował: Jacek Sroka 32 Przełączanie wyglądu i zachowania w trakcie startu aplikacji java -Dswing.defaultlaf= com.sun.java.swing.plaf.gtk.gtklookandfeel MyApp jak nie doszło jeszcze do statycznej inicjalizacji żadnej klasy Swinga UIManager.setLookAndFeel(String) w trakcie działania aplikacji SwingUtilities.updateComponentTreeUI(Component) dwie przydatne metody: UIManager.getSystemLookAndFeelClassName() UIManager.getCrossPlatformLookAndFeelClassName()
Przygotował: Jacek Sroka 33 Listwa górna i ramka okna Niektóre wyglądy potrafią same rysować listwę górną i ramkę okna, np. javax.swing.plaf.metal.metallookandfeel zazwyczaj jest dostarczana przez menadżera okien JFrame.setDefaultLookAndFeelDecorated(true)
Przygotował: Jacek Sroka 34 Co dalej Ćwiczenia z ważniaka Bardzo dobre przewodniki na http://java.sun.com/docs/books/tutorial/ Projekt Matisse http://www.netbeans.org/kb/trails/matisse.html