Upload
fritz-cleveland
View
164
Download
0
Embed Size (px)
DESCRIPTION
Swing Java. Wykład 7. mgr inż. Michał Misiak. Plan wykładu. Co to jest Swing Swing w NetBeans Obsługa zdarzeń w Swing Nasłuchiwacze Kontrolki Swing. Co to jest Swing. Swing jest częścią Java Foundation Classes (JFC) Swing zapewnia: - PowerPoint PPT Presentation
Citation preview
Uniwersytet ŁódzkiWydział Matematyki i Informatyki, Katedra Analizy Nieliniowej
Swing Java
Wykład 7
mgr inż. Michał Misiak
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007
Plan wykładu
Co to jest Swing Swing w NetBeans Obsługa zdarzeń w Swing Nasłuchiwacze Kontrolki Swing
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007
Co to jest Swing
Swing jest częścią Java Foundation Classes (JFC) Swing zapewnia:
Zbiór kontrolek do tworzenia zaawansowanych GUI: tabele, listy, drzewa, taby, etc …
rozbudowaną funkcjonalność do pracy z tekstem wsparcie dla wielonarodowości (języki, odpowiedni układ elementów) look & feels (zaawansowane l’n’f z synth) Java 2D (Swing został zbudowany na tym pakiecie) Mechanizm do przywracania i ponawiania operacji (undo & redo) wsparcie dla osób niepełnosprawnych (lupa, syntezator, wyświetlanie
informacji na wyświetlaczu brile’a) transfer danych: operacja wklej, wytnij, drag&drop
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007
Kontroli w Swing
JButton JCheckBox JComboBox JList JMenu JRadioButton JSlider JSpinner
JTextField JPasswordField
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007
Kontrolki z formatowaniem
JColorChooser JEditorPane JTextPane JFileChooser JTable JTextArea JTree
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007
Kontrolki do wyświetlania informacji oraz kontrolki najwyższego poziomu
JLabel JProgressBar JSeparator JToolTip
JPanel JScrollPane JSplitPane JTabbedPane JToolBar JInternalFrame JLayeredPane RootPane
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007
Swing & Netbeans
Wsparcie IDE przy projektowaniu GUI – automatyczna generacja kodu
Narzędzia do projektowania GUI w NetbeansPaleta kontrolekObszar do projektowaniaOkno właściwości Inspektor
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007
Przykład 1
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007
Event Listner
W celu obsłużenia danego typu zdarzenia należy zaimplementować odpowiedni typu interfejsu np. ActionListner
Dana klasa może implementować wiele nasłuchiwaczy
Każde zdarzenie ma typ i informację o źródle
Generatorami zdarzeń są przeważnie komponenty bądź modele
event source
event listner
event listner
event listner
event source
event object
eve
nt o
bje
ct
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007
Zdarzenia
Zdarzenia powinny być mały obiektami ponieważ obsługiwane są przez główny wątek zajmujący się również rysowaniem
Dłuższe operacje powinny być wykonywane w nowym wątku
Podejścia do implementacji nasłuchwiaczy: osobna klasa implementacja jako klasa prywatna wykorzystanie klasy EventHandler dla prostych zdarzeń
Każde ze zdarzeń dziedziczy z typu EventObject, natomiast jest przeważnie uszczegółowiany np. (MouseEvent)
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007
Typy zdarzeń
Zdarzenia niskopoziomowe (Low-Level Events) niskopoziomowe zdarzania w ramach okna oraz wejścia Przykłady: MouseEvent, KeyEvent
Zdarzenia semantyczne (Semantic Events) Mogą być odpalane przez wejście użytkownika lub pojawienie
się danych Przykłady: Action i Item
Zaleca się nasłuchiwanie zdarzeń semantyczny niż niskopoziomowych, gdyż pozwala to na przenaszalność aplikacji
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007
Interfejsy
Jeden interfejs może mieć więcej niż jedną metodą. Np. MouseListner zawiera metody: mousePressed, mouseReleased, mouseEntered, mouseExit i mouseClick
Zgodnie z założeniami Javy należy zaimplementować wszystkie funkcje interfejsu, jednak nieużywane mogą mieć puste ciało
Zestaw Interfejsów i Adapterów: http://java.sun.com/docs/books/tutorial/uiswing/events/api.html
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007
Adapter
Każdy nasłuchiwać interfejs może mieć kilka typów adapterów
Adapter implementuje wszystkie metody interfejsu z pustym ciałem
Klas, która ma obsługiwać dany typ zdarzeń dziedziczy po klasie adapter
Wybrane metody należy przeładować
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007
Klasy wewnętrzne i anonimowe klasy wewnętrzne Problem: wykorzystać adapter ale bez
konieczności dziedziczenia przez klasę publiczną? Np. aplet dziedziczy już po klasie Applet, więc de facto nie może implementować adaptera
Rozwiązanie: stworzyć klasę wewnętrzną stworzyć klasę anonimową
Wydajność: szybkość uruchomienia aplikacji oraz wielkość pamięci zależna od ilości załadowanych klas
Jeśli klasa nie będzie zadeklarowana jako statyczna, ma ona dostęp do pól klasy, w której się znajduje.
public class MyClass extends Applet { ... cos.addMouseListener(new MyAdapter()); ... class mojAdapter extends MouseAdapter { public void mouseClicked(MouseEvent e) {//implementacja obsługi zdarzenia } }}public class MyClass extends Applet { ...
cos.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e)
{//implementacja obsługi zdarzenia }
}); ... }}
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007
Klasa EventHandler Klasa EventHandler wspiera
dynamiczne generowanie prostego jednowyrażeniowego nasłuchiwacza zdarzeń
Pozwala uprościć strukturę kodu Zwiększa wydajność aplikacji – nie
potrzeba wczytywać dodatkowych klas (wielokrotna implementacja klasy dla tego samego typu interfejsu)
Wykorzystanie EventHandler uniemożliwia wykrycie błędu podczas komplikacji. W przypadku błędu w trakcie wykonywania programu rzuci obrzydliwy wyjątek.
Umożliwia rozseparowanie logiki aplikacji od grafiki
//zastosowanie EventHandlermyButton.addActionListener((Act
ionListener)EventHandler.create(ActionListener.class, frame, "toFront"));
//zastosowanie klasy wewnetrznej
myButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
frame.toFront(); } });
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007
Zastosowania EventHandler Umożliwia szybki dostęp do właściwości
obiektu generatora zdarzeń i ustawienie na docelowym elemencie
//uzycie EventHandlerEventHandler.create(ActionListener.c
lass, myButton, "label", "source.text")
//uzycie klasy wewnetrznejnew ActionListener() { public void
actionPerformed(ActionEvent e) {
myButton.setLabel(((JTextField)e.getSource()).getText());
}}
//uzycie EventHandlerEventHandler.create(ActionListener.c
lass, myButton, "nextFocusableComponent", "source")
//uzycie klasy wewnetrznejnew ActionListener() { public void
actionPerformed(ActionEvent e) {
myButton.setNextFocusableComponent((Component)e.getSource());
}}
Umożliwia szybki dostęp do właściwości zdarzenia i ustawia wartość na obiekcie źródłowym
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007
Lista nasłuchiwaczy wspieranych przez wszystkie kompnenty Component Listener –
nasłuchuje zdarzeń związanych ze zmianą wielkości, widoczności oraz pozycji komponentu
Focus Listener – sprawdza, czy komponent jest ustawiony fokus
Key Listener – zdarzenia odpalane są tylko przez komponent, na którym jest fokus
Mouse Listener – nasłuchuje kliknięcia, przytrzymania klawisza, ruchu myszki wewnątrz lub poza komponent
Mouse-Montion Listener – nasłuchuje zmian pozycji kursora
Mouse-Wheel Listener – ruch kółka myszki ponad komponentem
Hierarchy Bound Listner – zmiany w hierarchii zawierania komponentów dotyczący pozycji oraz skalowania
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007
Przykładowy nasłuchiwacz: Compnent Listener
Nasłuchuje zdarzeń generowanych przez komponent tj.: Zmiana pozycji Zmiana rozmiar Ukrycie
Adapter Compenent Adapter Kolejne kroki przy pisaniu Compnent Listner:
Deklaracja klasy implementującej nasłuchiwacz Wybranie komponentu, który przechwyci zdarzenia Dodanie nasłuchiwacza do wybranych komponentów Obsłużenie zdarzeń: Hidden, Shown, Resized, Moved
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007
Przykładowy nasłuchiwacz: Container Listener
Służy do pobierania zdarzeń generowanych na poziomie kontenera dodanie/usunięcie kontenera
public class ContainerEventDemo implements ContainerListener { ... przycisk = new JPanel(new GridLayout(1,1)); przycisk.addContainerListener(this); ... public void componentAdded(ContainerEvent e) { displayMessage(" dodano ", e); } public void componentRemoved(ContainerEvent e) { displayMessage(" usunieto ", e); } void displayMessage(String akcja, ContainerEvent e) { wyswietlacz.append(((JButton)e.getChild()).getText() + " was" + action + e.getContainer().getClass().getName() + newline); } ... }
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007
Przyciski (Buttons)
Przycisk umożliwia: Wyświetlanie tekstu i obrazów Przypisanie skrótów
(podświetlenie litery w przycisku – tzw. mnemonic)
Wyświetlanie podpowiedzi (ToolTip)
wyświetlenie tekstu formatowanego w HTML
Nasłuchiwacze: Action Listner
Ustawienie standardowego przycisku (setDefaultButton)
//stworzenie przyciskub1 = new JButton(„Nazwa", Icon);//ustawienie skrótusetMnemonic(KeyEvent.VK_M)//ustawnie nazwy akcjib1.setActionCommand(„akcja") //ustawienie Action Listnerb1.addActionListener(this); //ustawienie podpowiedzib1.setToolTipText(„porada”)//wylaczenie przyciskub3.setEnabled(false);
//Obsluga zdarzeniapublic void actionPerformed(ActionEvent e)
{
if(„Nazwa".equals(e.getActionCommand())) {
b2.setEnabled(false);…
Więcej informacji: http://java.sun.com/docs/books/tutorial/uiswing/components/button.html#abstractbutton
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007
Check Boxes & Przycisk Radio
CB stanowi grupę, w której wszystkie, kilka bądź żaden może zostać zaznaczony
JCheckBox i JCheckBoxMenuItem dziedziczą z AbstractButton – możliwość umieszczania CB w Menu
Możliwość formatowania CB podobnie jak przycisku
Przycisk Radio – możliwość zaznaczenia wyłączenie jednego przycisku
pierwszyButton = new JCheckBox(„pierwszy");
pierwszyButton.setMnemonic(KeyEvent.VK_P); //zaznaczanie przyciskupierwszyButton.setSelected(true);
drugiButton = new JCheckBox(„Drugi");drugiButton.setMnemonic(KeyEvent.VK_G); drugiButton.setSelected(true);
//obsluga zdarzenpierwszyButton.addItemListener(this);public void itemStateChanged(ItemEvent e)
{ ... Object source = e.getItemSelectable();
if (source == pierwszyButton) { //TODO } else if (source == drugiButton) {
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007
Grupowanie przycisków
Możliwość dodania różnych RB lub CB do wybranej grupy ButtonGroup
Umieszczanie innych rodzajów przycisków poza RB lub CB nie ma sensu, ponieważ nie implementują stanu włączony/wyłączony
Kroki przy tworzeniu grupy przycisków Stwórz podklasę JFrame Wywołaj ContextPane razem z layout manager Zadeklaruj zbiór przycisków radio Stwórz obiekt ButtonGroup Wołaj metodę add na obiekcie buttongroup w celu dodania
każdego przycisku do grupy
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007
Color Chooser
Paleta kolorów z funkcjonalnością wyboru
Paleta składa się z dwóch części: zestawu kolorów oraz podglądu
CC wykorzystuje ColorSelectionModel. Model obsługuje RGB, HSB
ColorSelectionModel odpala zdarzenia po każdej zmianie koloru
Pokazywanie CC jako okno dialogowe
Możliwość usunięcia panelu do poglądu, po przez ustawienie panelu bez rozmiaru
cc = new JColorChooser(o.getForeground());
//wykorzystanie ColorSelectionModel
cc.getSelectionModel().addChangeListener(this);
. . .
public void stateChanged(ChangeEvent e) {
Color newColor = cc.getColor();
obraz.setForeground(newColor);
}
Color newColor = JColorChooser.showDialog(
ColorChooserDemo2.this,
"Choose Background Color",
banner.getBackground());
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007
Kontenery najwyższego poziomu
Kontenery najwyższego poziomu (top-level) to: JFrame, JDialog i JApplet
Każde komponent musi przynależeć do hierarchii komponentów. Hierarchia (conatainment hierarchy) jest to drzewo, którego liśćmi są komponenty, a korzeniem kontener najwyższego poziomu.
W przypadku, gdy są trzy top-level kontenery wówczas mamy 3 hierarchie
Każdy kontener najwyższego poziomu zawiera tzw. content pane, do którego dodawane są komponenty
Menu Bar – jest uznawany jako kontener najwyższego poziomu, ale poza content pane
ContentPane
ContentPane
MenuBar
Kontener najwyższego
poziomu
JFrame
JFrame
JMenuBar
ContentPaneJLabel
Dodawanie komponentuokno.getContentPane().add(yellowLabel, BorderLayout.CENTER);
Layered Pane
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007
JCompnent
Wszystkie komponenty Swingowe z „J” dziedziczą po JCompnent. Np. JPanel, JButton, etc…
JCompnent rozszerza Container, a Container rozszerza Component. Compnent udostępnia
generowanie zdarzeń i rysowanie.
Container umożliwia dodawanie do niego komponentów i rozkładanie ich
Wszystkie komponenty Porady - Tool tips – tekst pomocniczy.
Ustawiane za pomocą metody: setToolTipText
Rysowanie i obramowanie. setBoreder pozwala zdefiniować obramowanie komponentu. Rysowanie realizowane jest w metodzie paintComponent
Look and feel. Charakterystyczne właściwości.
Możliwość umieszczania dodatkowych informacji put/getClientProperty
Wsparcie dla rozkładu Wsparcie dla osób niepełnosprawnych Wsparcie dla drag ‘n’ drop Podwójne buforowanie Wsparcie dla klawiatury
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007
Text Component
JTextCompnent
JTextField
JFormattedTextField
JPassworField
Kontrolki tekstowe
JTextField
JFormattedTextField
JPassworField
Formatowane obszary tekstu
JTextField
Obszar tekstu
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007
JTextComponent
JTextComponent udostępnia następującą funkcjonalność: model document, który zarządza treścią komponentu view sposób wyświetlania dokumentu na ekranie sterownik zwany editor kit, który implementuje
zdarzenia wykorzystywane przy edycji tekstu wsparcie dla funkcji cofnij i ponów (undo/redo) filtry do nawigowania po dokumencie oraz zdarzenia
dla „karetki” (caret)
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007
Dokument
Rozdzielenie widoku od danych Klasa document implementuje document interfejs Dokument udostępnia funkcjonalność:
zawiera tekst w elementach, które mogą odnosić się do paragrafu, logicznej struktury
umożliwia edycję po przez wołanie metod remove i insertString nasłuchiwacze do zmian wprowadzanych w tekście zarządza obiektem Position, który śledzi pozycję podczas
wprowadzania zmian do tekstu pozwala na uzyskanie informacji o długości tekstu, segmentach tekstu,
etc… Interfejs StyledDocument pozwala na zaznaczanie tekstu
określonym stylem
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007
Nasłuchiwacz dla zmian
Dwa rodzaje nasłuchiwaczy: dla dokumentu dla obsługi funkcji cofnij/ponów
Nasłuchiwacza dla zmian w dokumencie odbiera zdarzenia: wstawiania usuwania zmiany stylu tekstu
StyleDocument pozwala na generowanie wszystkich zdarzeń.
PlainDocument umożliwia generowanie wyłączenie zdarzeń dotyczących wstawiania/usuwania
doc.addDocumentListener(new MyDocumentListener());
protected class MyDocumentListener implements DocumentListener {
public void insertUpdate(DocumentEvent e) {
displayEditInfo(e);
}
public void removeUpdate(DocumentEvent e) {
displayEditInfo(e);
}
public void changedUpdate(DocumentEvent e) {
displayEditInfo(e);
}
private void displayEditInfo(DocumentEvent e) {
Document document = (Document)e.getDocument();
int changeLength = e.getLength();
changeLog.append(e.getType().toString() + ": "
+ changeLength + " character"
+ ((changeLength == 1) ? ". " : "s. ")
+ " Text length = " + document.getLength()
+ "." + newline);
}
}