swing java

29
Uniwersytet Łódzki Wydział Matematyki i Informatyki, Katedra Analizy Nieliniowej Swing Java Wykład 7 mgr inż. Michał Misiak

Upload: fritz-cleveland

Post on 03-Jan-2016

164 views

Category:

Documents


0 download

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

TRANSCRIPT

Page 1: Swing Java

Uniwersytet ŁódzkiWydział Matematyki i Informatyki, Katedra Analizy Nieliniowej

Swing Java

Wykład 7

mgr inż. Michał Misiak

Page 2: Swing Java

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

Page 3: Swing Java

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

Page 4: Swing Java

Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007

Kontroli w Swing

JButton JCheckBox JComboBox JList JMenu JRadioButton JSlider JSpinner

JTextField JPasswordField

Page 5: Swing Java

Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007

Kontrolki z formatowaniem

JColorChooser JEditorPane JTextPane JFileChooser JTable JTextArea JTree

Page 6: Swing Java

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

Page 7: Swing Java

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

Page 8: Swing Java

Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007

Przykład 1

Page 9: Swing Java

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

Page 10: Swing Java

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)

Page 11: Swing Java

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

Page 12: Swing Java

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

Page 13: Swing Java

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ć

Page 14: Swing Java

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 }

}); ... }}

Page 15: Swing Java

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(); } });

Page 16: Swing Java

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

Page 17: Swing Java

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

Page 18: Swing Java

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

Page 19: Swing Java

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); } ... }

Page 20: Swing Java

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

Page 21: Swing Java

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) {

Page 22: Swing Java

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

Page 23: Swing Java

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());

Page 24: Swing Java

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

Page 25: Swing Java

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

Page 26: Swing Java

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

Page 27: Swing Java

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)

Page 28: Swing Java

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

Page 29: Swing Java

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);

}

}