background image

 

Przygotował: Jacek Sroka

1

Java SE

Swing

background image

 

Przygotował: Jacek Sroka

2

GUI w Javie

Abstract Window Toolkit (AWT)

podstawowy 

(wspólny mianownik)

 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

background image

 

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)

background image

 

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

gorsze przenośność aplikacji (WORE vs WOTE)

background image

 

Przygotował: Jacek Sroka

5

import

 javax.swing.*;

public

 

class

 WitajŚwiecie {

  

private

 

static

 

void

 utwórzGUI() {

    

//tworzenie nowego okna 

    JFrame frame = 

new

 JFrame(

"Okno WitajŚwiecie"

);

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

      }

    });

  }

}

Przykład

background image

 

Przygotował: Jacek Sroka

6

Zarządcy układu

BorderLayout

używany domyślnie przez główne komponenty (JApplet, JDialog i 
JFrame)

ogólnie ustawiamy 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

background image

 

Przygotował: Jacek Sroka

7

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

background image

 

Przygotował: Jacek Sroka

8

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

background image

 

Przygotował: Jacek Sroka

9

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

    

//...

background image

 

Przygotował: Jacek Sroka

10

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) 

background image

 

Przygotował: Jacek Sroka

11

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) 

background image

 

Przygotował: Jacek Sroka

12

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) 

background image

 

Przygotował: Jacek Sroka

13

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/

background image

 

Przygotował: Jacek Sroka

14

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

background image

 

Przygotował: Jacek Sroka

15

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)

background image

 

Przygotował: Jacek Sroka

16

Co dalej

Ćwiczenia z ważniaka

Baza osób

dwie wersje: najpierw z serializacją potem z JPA

Bardzo dobre przewodniki na

http://java.sun.com/docs/books/tutorial/

Projekt Matisse

http://www.netbeans.org/kb/trails/matisse.html