Przygotował: Jacek Sroka
1
Java SE
Swing
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
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)
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)
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
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
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
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()
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);
//...
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)
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)
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)
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/
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()
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)
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