Swing java
This presentation is the property of its rightful owner.
Sponsored Links
1 / 29

Swing Java PowerPoint PPT Presentation


  • 321 Views
  • Uploaded on
  • Presentation posted in: General

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:

Download Presentation

Swing Java

An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -

Presentation Transcript


Swing java

Swing Java

Wykład 7

mgr inż. Michał Misiak


Plan wyk adu

Plan wykładu

  • Co to jest Swing

  • Swing w NetBeans

  • Obsługa zdarzeń w Swing

  • Nasłuchiwacze

  • Kontrolki Swing


Co to jest swing

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


Kontroli w swing

JButton

JCheckBox

JComboBox

JList

JMenu

JRadioButton

JSlider

JSpinner

JTextField

JPasswordField

Kontroli w Swing


Kontrolki z formatowaniem

Kontrolki z formatowaniem

  • JColorChooser

  • JEditorPane

  • JTextPane

  • JFileChooser

  • JTable

  • JTextArea

  • JTree


Kontrolki do wy wietlania informacji oraz kontrolki najwy szego poziomu

JLabel

JProgressBar

JSeparator

JToolTip

JPanel

JScrollPane

JSplitPane

JTabbedPane

JToolBar

JInternalFrame

JLayeredPane

RootPane

Kontrolki do wyświetlania informacji oraz kontrolki najwyższego poziomu


Swing netbeans

Swing & Netbeans

  • Wsparcie IDE przy projektowaniu GUI – automatyczna generacja kodu

  • Narzędzia do projektowania GUI w Netbeans

    • Paleta kontrolek

    • Obszar do projektowania

    • Okno właściwości

    • Inspektor


Przyk ad 1

Przykład 1


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 Listner

event source

event object

event listner

event listner

event listner

event object

event source


Zdarzenia

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)


Typy zdarze

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


Interfejsy

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


Adapter

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ć


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

}

});

...

}

}

Klasy wewnętrzne i anonimowe klasy wewnętrzne


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 EventHandler

myButton.addActionListener((ActionListener)EventHandler.create(ActionListener.class, frame, "toFront"));

//zastosowanie klasy wewnetrznej

myButton.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {

frame.toFront();

}

});

Klasa EventHandler


Zastosowania eventhandler

Umożliwia szybki dostęp do właściwości obiektu generatora zdarzeń i ustawienie na docelowym elemencie

//uzycie EventHandler

EventHandler.create(ActionListener.class, myButton, "label", "source.text")

//uzycie klasy wewnetrznej

new ActionListener() {

public void actionPerformed(ActionEvent e) {

myButton.setLabel(((JTextField)e.getSource()).getText());

}

}

Zastosowania EventHandler

  • Umożliwia szybki dostęp do właściwości zdarzenia i ustawia wartość na obiekcie źródłowym

//uzycie EventHandler

EventHandler.create(ActionListener.class, myButton, "nextFocusableComponent", "source")

//uzycie klasy wewnetrznej

new ActionListener() {

public void actionPerformed(ActionEvent e) {

myButton.setNextFocusableComponent((Component)e.getSource());

}

}


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

Lista nasłuchiwaczy wspieranych przez wszystkie kompnenty


Przyk adowy nas uchiwacz compnent listener

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


Przyk adowy nas uchiwacz container listener

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

}


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 przycisku

b1 = new JButton(„Nazwa", Icon);

//ustawienie skrótu

setMnemonic(KeyEvent.VK_M)

//ustawnie nazwy akcji

b1.setActionCommand(„akcja")

//ustawienie Action Listner

b1.addActionListener(this);

//ustawienie podpowiedzi

b1.setToolTipText(„porada”)

//wylaczenie przycisku

b3.setEnabled(false);

//Obsluga zdarzenia

public void actionPerformed(ActionEvent e) {

if(„Nazwa".equals(e.getActionCommand())) {

b2.setEnabled(false);

Przyciski (Buttons)

Więcej informacji: http://java.sun.com/docs/books/tutorial/uiswing/components/button.html#abstractbutton


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 przycisku

pierwszyButton.setSelected(true);

drugiButton = new JCheckBox(„Drugi");

drugiButton.setMnemonic(KeyEvent.VK_G);

drugiButton.setSelected(true);

//obsluga zdarzen

pierwszyButton.addItemListener(this);

public void itemStateChanged(ItemEvent e) {

...

Object source = e.getItemSelectable();

if (source == pierwszyButton) {

//TODO

} else if (source == drugiButton) {

Check Boxes & Przycisk Radio


Grupowanie przycisk w

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


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

Color Chooser


Kontenery najwy szego poziomu

Kontener

najwyższego

poziomu

JFrame

ContentPane

ContentPane

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

MenuBar

JFrame

JMenuBar

Layered

Pane

Dodawanie komponentu

okno.getContentPane().add(

yellowLabel, BorderLayout.CENTER);

JLabel

ContentPane


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

JCompnent


Text component

JTextCompnent

JTextField

JTextField

JFormattedTextField

JFormattedTextField

JTextField

JPassworField

JPassworField

Kontrolki tekstowe

Formatowane obszary tekstu

Obszar tekstu

Text Component


Jtextcomponent

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)


Dokument

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


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

}

}

Nasłuchiwacz dla zmian


  • Login