Języki Programowania II Wykład 7 Java Swing
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
Swing to co w AWT plus GUI w Javie c.d. 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)
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ść aplikacjito co w AWT plus
Przykład
Podstawowe komponenty JLabel 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ń
Podstawowe komponenty Jbutton 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
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
Przykład
Przykład c.d.
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?
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 pozwala komponentom na preferowany rozmiar, nawet jak nie będą przez to widoczne w całości
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
JComboBox Jeszcze trochę komponentów 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 getpassword() zwraca char[]
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
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
JSlider Jeszcze trochę komponentów c.d. 19 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ół
JToolBar Jeszcze trochę komponentów c.d. 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()
JTextArea Jeszcze trochę komponentów c.d. wieloliniowe pole tekstowe is/setlinewrap() czy załamywać linie is/setwrapstyleword() czy załamywać słowa JScrollPane przykład Dekoratora gethorizontalscrollbar() zwraca zawarte obiekty JScrollBar getverticalscrollbar() analogicznie get/sethorizontalscrollbarpolicy() Always, Never lub Needed get/setverticalscrollbarpolicy() analogicznie
JList Jeszcze trochę komponentów c.d. 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 get/setselectedvalue() zaznaczony obiekt
Jeszcze trochę komponentów c.d. JTable JTree
Obsługa zdarzeń Wzorzec Obserwator (ang. Observer) Wydawca-Prenumerator (ang. Publish-Subscribe) Delegowanie obsługi zdarzeń (ang. Delegation Event Model) Konwencja nazewnicza addactionlistener(actionlistener) removeactionlistener(actionlistener) actionperformed(actionevent) Kod obsługi zdarzeń wykonywany jest przez wątek koordynujący zdarzenia długotrwałe operacje spowalniają interfejs można używać SwingUtilities.invokeLater() uwaga na zakleszczenia przy przebudowywaniu interfejsu z innego wątku
Przykład
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)
Najważniejsze rodzaje zdarzeń c.d. 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)
Najważniejsze rodzaje zdarzeń c.d. 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)
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
Modele - przykład
Modele przykład c.d.
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/
Co dalej Bardzo dobre przewodniki na http://java.sun.com/docs/books/tutorial/ Java Swing tutorial na http://docs.oracle.com/javase/tutorial/uiswing/