Programowanie GUI

Transkrypt

Programowanie GUI
Programowanie graficznego interfejsu
użytkownika
Wykład 8
Maciej Wołoszyn
mailto:[email protected]∗
10 maja 2006
Spis treści
1
JFC/Swing
1.1
1.2
1.3
1.4
1.5
1.6
1.7
1.8
1.9
1.10
1.11
1.12
1.13
1
Prosty przykład . . . . . . . . . . . . . . . . . . . .
Swing i AWT . . . . . . . . . . . . . . . . . . . . .
Podstawowe klasy okien . . . . . . . . . . . . . . .
Przykładowe komponenty . . . . . . . . . . . . . . .
Dodawanie komponentów do obiektu macierzystego
Bezpieczeństwo watków
˛
. . . . . . . . . . . . . . .
Rozmieszczanie komponentów . . . . . . . . . . . .
Usuwanie komponentów . . . . . . . . . . . . . . .
Aplety . . . . . . . . . . . . . . . . . . . . . . . . .
Tworzenie apletu . . . . . . . . . . . . . . . . . . .
Umieszczanie apletu na stronie WWW . . . . . . . .
Appletviewer . . . . . . . . . . . . . . . . . . . . .
Cykl życia apletu . . . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
2
2
3
3
3
3
4
7
8
8
8
9
10
1 JFC/Swing
• JFC (Java Foundation Classes) – biblioteka klas Javy zawierajaca
˛ m.in.:
– komponenty GUI (Swing)
∗ Prosz˛
e o przesyłanie na ten adres informacji o znalezionych bł˛edach,
literówkach oraz propozycji zmian i uzupełnień. Dokument przygotowano za pomoca˛ systemu LATEX. Prawa autorskie zastrzeżone.
1
Programowanie GUI – Wykład 8
2
– Java 2D API
– wsparcie dla drag-and-drop
– mechanizmy internacjonalizacji programów
• zbiór komponentów GUI o nazwie Swing zawarty jest w pakietach javax.swing.*
• obecny w Javie od wersji 1.2
• komponenty Swing moga˛ być wykorzystywane zarówno w aplikacjach, jak i w apletach
(programach osadzonych w przegladarce
˛
internetowej)
1.1 Prosty przykład
import javax.swing.*;
public class P01 {
public static void main(String[] args) {
JFrame f = new JFrame("P01");
f.setDefaultCloseOperation(
JFrame.EXIT_ON_CLOSE );
f.setSize(500,300);
f.setVisible(true);
}
}
• program musi si˛e znajdować w pliku P01.java
– kompilacja:
javac P01.java
– uruchomienie:
java P01
Programowanie GUI – Wykład 8
3
1.2 Swing i AWT
• Swing oparty jest (także relacjami dziedziczenia) na pierwotnym zestawie narz˛edzi obsługujacych
˛
GUI w Javie od jej pierwszych wersji – tzw. AWT (Abstract Window Toolkit) → pakiety java.awt.*
Przykład:
java.lang.Object → java.awt.Component → java.awt.Container
java.awt.Window → java.awt.Frame → javax.swing.JFrame
→
1.3 Podstawowe klasy okien
• JFrame – pojedyncze okno aplikacji; rozwini˛ecie klasy Frame z AWT;
• JDialog – okno dialogowe
• JApplet – obszar apletu
1.4 Przykładowe komponenty
• JLabel – etykieta tekstowa
JLabel(String s)
• JButton – przycisk
JButton(String s)
• JTextField – pole tekstowe
JTextField(String s, int columns)
• JList – lista
JList(Object[] listData)
1.5 Dodawanie komponentów do obiektu macierzystego
• poprzez wywołanie (dla obiektu na wyższym poziomie hierarchii) metody:
add(Component comp)
• jeśli dodajemy do pojemnika (ramki, panela itp), który już jest wyświetlony, to należy
wywołać metod˛e
validate()
1.6 Bezpieczeństwo watków
˛
• w przeciwieństwie do AWT używajac
˛ pakietu Swing można dość łatwo zapewnić poprawność działania programów wielowatkowych
˛
Programowanie GUI – Wykład 8
4
• w tym celu do tworzenia lub modyfikowania elementów GUI zaleca si˛e wykorzystanie
konstrukcji:
javax.swing.SwingUtilities.invokeLater(
new Runnable() {
public void run(){ /* ... */ }
});
1.7 Rozmieszczanie komponentów
• elementów GUI z pakietu Swing nie dodaje si˛e zwykle bezpośrednio do okienka, ale do
zawartego w nim kontenera zwracanego przez metod˛e getContentPane()
import java.awt.*;
import javax.swing.*;
public class P10 extends JFrame{
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(
new Runnable() {
public void run() {
JFrame f = new JFrame("P10");
f.setDefaultCloseOperation(
JFrame.EXIT_ON_CLOSE);
Container c = f.getContentPane();
c.add(new JLabel("Napis JLabel"));
f.setSize(300,100);
f.setVisible(true);
}
});
}
}
• metoda pack() powoduje automatyczne dopasowanie rozmiaru okna do preferowanych
rozmiarów i rozmieszczenia komponentów
Programowanie GUI – Wykład 8
5
• sposób rozmieszczania elementów można zmieniać wykorzystujac
˛ tzw. menedżer
układu (Layout Manager) wybierany metoda˛ setLayout, np.
– FlowLayout – równomierne rozmieszczanie kolejno od lewej do prawej i od góry
do dołu
– BorderLayout – możliwość umieszczania elementów u góry, u dołu, po lewej, po
prawej oraz w centrum,
JFrame f = new JFrame("P11");
Container c = f.getContentPane();
c.setLayout(new FlowLayout());
c.add(new JLabel("Napis JLabel"));
c.add(new JButton("OK"));
f.pack();
f.setVisible(true);
JFrame f = new JFrame("BorderLayout");
Container c = f.getContentPane();
c.setLayout(new BorderLayout());
c.add(new JButton("Cancel"),
BorderLayout.NORTH);
c.add(new JLabel("Napis JLabel"));//CENTER
c.add(new JButton("OK"),
BorderLayout.SOUTH);
f.setSize(300,200);
f.setVisible(true);
Programowanie GUI – Wykład 8
6
• kolejne menedżery:
– BoxLayout oraz ułatwiajacy
˛ jego użycie kontener Box – układanie komponentów
w pionie lub w poziomie
– GridLayout – ułożenie na sieci prostokatnej
˛
JFrame f = new JFrame("Box");
Container c = f.getContentPane();
c.setLayout(new BorderLayout());
Box b = Box.createHorizontalBox();
b.add(Box.createHorizontalGlue());
b.add(new JButton("OK"));
b.add(Box.createHorizontalGlue());
b.add(new JButton("Cancel"));
b.add(Box.createHorizontalGlue());
c.add(new JLabel("Napis JLabel"));
c.add(b,BorderLayout.SOUTH);
Programowanie GUI – Wykład 8
7
JFrame f = new JFrame("GridLayout");
Container c = f.getContentPane();
c.setLayout(new GridLayout(2,2));
c.add(new JButton("OK"));
c.add(new JLabel("Napis JLabel"));
c.add(new JButton("Cancel"));
f.setSize(300,200);
f.setVisible(true);
• bardziej złożone układy elementów GUI można tworzyć posługujac
˛ si˛e panelami JPanel (również korzystajacymi
˛
z menedżerów układu, domyślnie jest to FlowLayout),
do których dodaje si˛e poszczególne komponenty
JFrame f = new JFrame("GridLayout+Panel");
Container c = f.getContentPane();
c.setLayout(new GridLayout(2,2));
JPanel p = new JPanel();
p.add(new JButton("OK"));
p.add(new JButton("Cancel"));
c.add(new JLabel("JLabel 1"));
c.add(p);
c.add(new JLabel("JLabel 2"));
f.pack();
Programowanie GUI – Wykład 8
8
1.8 Usuwanie komponentów
• może być przydatne np. do zmiany ich zestawu i rozmieszczenia
• usuwanie komponentów jest możliwe z wykorzystaniem metody
remove(Component comp)
• konieczne może być odświeżenie zawartości (przydatne metody: validate i repaint())
1.9 Aplety
• programy przeznaczone do działania w oknie przegladarki
˛
internetowej (która musi
w tym celu obsługiwać j˛ezyk Java)
• maja˛ działanie ograniczone wzgl˛edami bezpieczeństwa: brak dost˛epu do danych na lokalnym dysku (ale dost˛epny jest również mechanizm cyfrowych podpisów dla apletów)
• brak problemów z instalacja˛ programu-klienta
1.10 Tworzenie apletu
• wymaga utworzenia klasy dziedziczacej
˛ po klasie JApplet
• aplet nie potrzebuje metody main
• sposób obsługi elementów GUI, rysowania w oknie apletu itd. jest taki sam jak w przypadku aplikacji
• dla poprawy szybkości ładowania zaleca si˛e pakowanie apletów i towarzyszacych
˛
im
danych w archiwa JAR
import javax.swing.*;
import java.awt.*;
public class P19 extends JApplet {
public void init() {
JLabel jl = new JLabel("[APLET]");
getContentPane().add(jl);
}
}
Programowanie GUI – Wykład 8
1.11 Umieszczanie apletu na stronie WWW
• wymaga użycia znacznika <APPLET> w HTML-u
<HTML>
<HEAD><TITLE>Aplet P19</TITLE></HEAD>
<BODY>Java applet
<APPLET CODE="P19.class"
WIDTH=100 HEIGHT=100></APPLET>
</BODY>
</HTML>
→
1.12 Appletviewer
• szybki podglad
˛ apletu:
$ appletviewer plik.html
→
9
Programowanie GUI – Wykład 8
10
• appletviewer w pliku ignoruje wszystko poza znacznikiem <APPLET>, wi˛ec nie trzeba
nawet tworzyć pliku HTML do podgladu
˛ apletu – wystarczy w pliku źródłowym umieścić w komentarzu lini˛e taka˛ jak np.:
// <APPLET CODE="P19.class"
WIDTH=100 HEIGHT=100><APPLET>
i po skompilowaniu apletu uruchomić go poleceniem:
$ appletviewer P19.java
1.13 Cykl życia apletu
• zwykle redefiniuje si˛e niektóre lub wszystkie z nast˛epujacych
˛
metod klasy Applet:
– init() – automatycznie uruchamiana tylko raz: gdy aplet jest po raz pierwszy
ładowany przez przegladark˛
˛
e,
– start() – wywoływana za każdym razem, gdy przegladarka
˛
wyświetla stron˛e
z apletem,
– stop() – uruchamiana gdy przegladarka
˛
przechodzi na inna˛ stron˛e; zwykle służy
do zatrzymania kosztownych operacji (np. wyświetlania animacji),
– destroy() – uruchamiana na koniec działania apletu (wcześniej zostanie wywołana również stop())
• metody start() i stop() cz˛esto służa˛ do tworzenia, uruchamiania oraz zatrzymywania
watków
˛
Przykład: aplet, który może działać również jako niezależna aplikacja
// <applet code=P17 width=200 height=50></applet>
import javax.swing.*;
import java.awt.*;
public class P17 extends JApplet {
Programowanie GUI – Wykład 8
public void init() {
Container c = getContentPane();
c.setLayout(new FlowLayout());
c.add(new JButton("?"));
}
public static void main(String[] args) {
JApplet a = new P17();
JFrame f = new JFrame("Aplikacja");
f.getContentPane().add(a);
f.setSize(300,70);
a.init();
a.start();
f.setVisible(true);
}
}
11