Programowanie GUI

Transkrypt

Programowanie GUI
Programowanie graficznego interfejsu
użytkownika
Wykład 9
Maciej Wołoszyn
mailto:[email protected]∗
17 maja 2006
Spis treści
1
JFC/Swing – c.d.
1.1
1.2
1.3
1.4
1.5
1
Obsługa zdarzeń . . . . . . . . . . . . . . . . . . .
1.1.1 Klasy zdarzeń . . . . . . . . . . . . . . . .
1.1.2 Interfejsy nasłuchujace
˛ . . . . . . . . . . .
1.1.3 Adaptery . . . . . . . . . . . . . . . . . .
1.1.4 Zastosowanie klas wewn˛etrznych . . . . .
Definiowanie wygladu
˛ i zachowania komponentów
Rysowanie w oknie . . . . . . . . . . . . . . . . .
Standardowe okna dialogowe . . . . . . . . . . . .
Wybrane środowiska programistyczne . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
1
2
2
3
4
5
7
9
10
1 JFC/Swing – c.d.
1.1 Obsługa zdarzeń
• każde działanie użytkownika (np. naciśni˛ecie przycisku, wybór opcji menu) powoduje
wygenerowanie zdarzenia – obiektu klas dziedziczacej
˛ po java.util.EventObject
(można także generować zdarzenia nie zwiazane
˛
z GUI)
∗ 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 9
2
• Java używa modelu delegowania zdarzeń – wygenerowane zdarzenia sa˛ przekazywane
do obiektów nasłuchujacych
˛
• obiekty nasłuchujace
˛ musza˛ być rejestrowane (w źródle zdarzenia);
służa˛ do tego metody:
addTypListener(TypListener e)
(każdy Typ zdarzeń ma własna˛ metod˛e)
• kiedy wystapi
˛ zdarzenie określonego typu, to jego kopia zostanie przekazana do wszystkich obiektów nasłuchujacych
˛
zarejestrowanych dla tego typu zdarzeń (jest to tzw. grupowe rozgłaszanie)
• jeśli jakiś typ zdarzeń nie dopuszcza zarejestrowania jednocześnie kilku obiektów nasłuchujacych,
˛
to metoda addTypListener(TypListener e) b˛edzie rzucać wyjatek
˛
java.util.TooManyListenersException (dopuszczalne jest wtedy tylko wysyłanie
jednostkowe)
• obiekty nasłuchujace
˛ można także „wyrejestrować” metoda˛
removeTypListener(TypListener e)
• przykładem źródła zdarzeń zwiazanych
˛
z mysza˛ i klawiatura˛ jest klasa Component
1.1.1 Klasy zdarzeń
• klasy zdarzeń pochodza˛ od EventObject, niektóre z nich to:
– ActionEvent – naciśni˛ecie przycisku, dwukrotne klikni˛ecie elementu listy, wybór
pozycji z menu
– AdjustmentEvent – przesuni˛ecie paska przewijania
– ItemEvent – wybór elementu z listy albo pola wyboru
– KeyEvent – naciśni˛ecie/zwolnienie klawisza klawiatury
– MouseEvent – zdarzenia zwiazane
˛
z przesuwaniem myszy i użyciem jej przycisków
– WindowEvent – zmiana stanu, otwarcie, zamkni˛ecie okna
każda z powyższych klas zawiera zestaw metod (np. getX() dla klasy MouseEvent)
i stałych (np. SELECTED i DESELECTED dla klasy ItemEvent) pozwalajacych
˛
na uzyskanie szczegółowych informacji o zdarzeniu
1.1.2 Interfejsy nasłuchujace
˛
• obiekty nasłuchujace
˛ musza˛ implementować zdefiniowane w pakiecie java.awt.event
interfejsy definiujace
˛ metody do obsługi zdarzeń danego typu; przykłady:
– ActionListener – definiuje metod˛e
actionPerformed(ActionEvent e)
Programowanie GUI – Wykład 9
3
– ItemListener – metoda
itemStateChanged(ItemEvent e)
– KeyListener – metody
keyPressed(KeyEvent e)
keyReleased(KeyEvent e)
keyTyped(KeyEvent e) (uruchamiana, gdy na klawiturze wpisano znak)
– MouseListener – m.in.
mouseClicked(MouseEvent e)
– WindowListener – m.in.
windowClosing(WindowEvent e)
• wystapienie
˛
zdarzenia powoduje, że źródło wywoła odpowiednia˛ metod˛e zaimplementowana˛ w obiekcie nasłuchujacym
˛
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
class L implements MouseListener {
public void mouseClicked(MouseEvent e){
System.out.println("[Klik]"); }
public void mouseExited(MouseEvent e){
System.out.println("[Out]"); }
public void mouseEntered(MouseEvent e){
System.out.println("[In]");
}
public void mousePressed(MouseEvent e){}
public void mouseReleased(MouseEvent e){}
}
class P02 {
public static void main(String[] args) {
Frame f = new Frame("Moje okno");
L ml = new L();
f.addMouseListener(ml);
f.setVisible(true);
}
}
1.1.3 Adaptery
• klasy upraszczajace
˛ tworzenie obiektów obsługujacych
˛
zdarzenia
• zawieraja˛ gotowe, puste implementacje wszystkich wymaganych przez interfejs metod
Programowanie GUI – Wykład 9
4
• przykłady:
– KeyAdapter
– MouseAdapter
– WindowAdapter
Przykład: zamkni˛ecie okna wymaga zaimplementowania metody windowClosing() interfejsu WindowListener i użycia instrukcji setVisible(false) oraz zakończenia programu
za pomoca˛ System.exit(0);
dzi˛eki WindowAdapter nie musimy implementować wszystkich metod interfejsu WindowListener
class WA extends WindowAdapter {
JFrame f;
WA(JFrame f) { this.f=f; }
public void windowClosing(WindowEvent e){
f.setVisible(false); System.exit(0); } }
class P03 {
public static void main(String[] args) {
JFrame f = new JFrame("Moje okno");
WA wa = new WA(f);
f.addWindowListener(wa);
f.setSize(300,200);
f.setVisible(true);
}
}
1.1.4 Zastosowanie klas wewnetrznych
˛
• dalsza możliwość uproszczenia kodu dzi˛eki temu, że klasa wewn˛etrzna ma dost˛ep do
danych z zewn˛etrznego zakresu
• mechanizm przydatny zwłaszcza dla zdarzeń niewymagajacych
˛
skomplikowanej obsługi
public static void main(String[] args) {
JFrame f = new JFrame("Moje okno");
class IWA extends WindowAdapter {
public void
windowClosing(WindowEvent e){
System.exit(0); }
Programowanie GUI – Wykład 9
5
}
f.addWindowListener(new IWA());
f.setSize(300,200);
f.setVisible(true);
}
• kolejne uproszczenie może być wykonane za pomoca˛ anonimowych klas wewn˛etrznych
public static void main(String[] args) {
JFrame f = new JFrame("Moje okno");
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e){
System.exit(0);
}
});
f.setSize(300,200);
f.setVisible(true);
}
• zamykanie okna programu nie wymaga koniecznie obsługi zdarzeń – jest możliwe również poprzez wywołanie metody
setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
(zast˛epuje obsług˛e zamykania okna poprzez zdarzenie WindowEvent)
1.2 Definiowanie wygladu
˛ i zachowania komponentów
• wyglad
˛ komponentów zawierajacych
˛
tekst można modyfikować metodami takimi jak:
setFont(Font font)
JLabel l = new JLabel("abcdef...");
l.setFont(new Font(
"Helvetica",Font.BOLD,50) );
• tekst może być również formatowany z użyciem znaczników HTML
String s = "<html><p>Line 1</p>";
s=s+"<p><i>Line 2</i></p>";
s=s+"<p><font color=red>Line 3</font></p>";
Programowanie GUI – Wykład 9
6
s=s+"</html>";
JLabel l = new JLabel(s);
• komponenty, które zajmuja˛ (lub moga˛ zajać)
˛ wi˛ecej miejsca niż jest dost˛epne dla nich
w oknie umieszcza si˛e cz˛esto wewnatrz
˛ obiektu JScrollPane
JTextArea ta = new JTextArea();
for(int i=1; i<20; i++)
ta.append("-> "+i+"\n");
JScrollPane sp = new JScrollPane(ta);
c.add(sp);
• ustawienie domyślnego przycisku (wybieranego naciśni˛eciem Entera) wymaga użycia
dla obiektu JRootPane funkcji
setDefaultButton(JButton defaultBt)
JButton bYes = new JButton("Yes");
JButton bNo = new JButton("No");
JButton bCancel = new JButton("Cancel");
c.add(bYes); c.add(bNo); c.add(bCancel);
f.getRootPane().setDefaultButton(bCancel);
• podpowiedzi w „dymkach” (tool-tips) definiowane sa˛ w bardzo prosty sposób poprzez
użycie funkcji
setToolTipText(String s)
Programowanie GUI – Wykład 9
7
JButton bStop = new JButton("Stop");
c.add(bStop);
bStop.setToolTipText(
"Stops current activity");
1.3 Rysowanie w oknie
• wymaga dost˛epu do kontekstu graficznego (obiektu klasy Graphics przekazywanego
np. do metody paint(Graphics g) albo możliwego do uzyskania za pomoca˛ getGraphics())
• metoda paint(Graphics g) jest wywoływana automatycznie za każdym razem, gdy
trzeba wyświetlić zawartość okna (np. po jego utworzeniu, przywróceniu itp.), nie należy jej używać bezpośrednio
• ponowne odrysowanie zawartości okna można wymusić metoda˛ repaint()
• współrz˛edne ekranowe obliczane sa˛ od lewego górnego rogu okna w którym rysujemy
• elementy nie mieszczace
˛ si˛e w oknie zostana˛ automatycznie przyci˛ete
• przykłady metod klasy Graphics:
– drawString(String s,int x,int y)
– drawLine(int x0,int y0,int x1,int y1)
– drawOval(int xl,int yt,int w,int h)
– fillOval(int xl,int yt,int w,int h)
• jako obszar rysowania wykorzystywana jest cz˛esto klasa dziedziczaca
˛ po JPanel i definiujaca
˛ własna˛ wersj˛e metody
paintComponent(Graphics g)
Programowanie GUI – Wykład 9
class Plot extends JPanel {
int x=-50, y=-50;
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.fillOval(x,y,5,5);
g.drawOval(x-5,y-5,15,15);
g.drawOval(x-10,y-10,25,25);
}
}
class ML extends MouseAdapter {
Plot plot;
public ML(Plot p) { plot = p; }
public void mousePressed(MouseEvent e){
plot.x=e.getX();
plot.y=e.getY();
plot.repaint();
}
}
public class P24 {
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(
new Runnable() {
public void run() {
JFrame f = new JFrame("P24");
f.setDefaultCloseOperation(
JFrame.EXIT_ON_CLOSE);
Container c = f.getContentPane();
Plot p = new Plot();
c.add(p);
8
Programowanie GUI – Wykład 9
p.addMouseListener(new ML(p));
f.setSize(300,200);
f.setVisible(true);
}
}
);
}
}
1.4 Standardowe okna dialogowe
• klasa JOptionPane – proste okna dialogowe
JOptionPane.showMessageDialog(frame,
"Important message.");
JOptionPane.showMessageDialog(frame,
"Shutting down...",
"Error",
JOptionPane.ERROR_MESSAGE);
• klasa JFileChooser – okno wyboru plików
JFileChooser fc = new JFileChooser();
int r = fc.showOpenDialog(frame);
if (r == JFileChooser.APPROVE_OPTION) {
File file = fc.getSelectedFile();
9
Programowanie GUI – Wykład 9
JOptionPane.showMessageDialog(frame,
"[ " + file.getName() + " ]");
}
1.5 Wybrane środowiska programistyczne
? Sun netBeans i oparte na nim Java Studio
10
Programowanie GUI – Wykład 9
Przykład tworzenia programu:
11
Programowanie GUI – Wykład 9
12
Programowanie GUI – Wykład 9
13
Programowanie GUI – Wykład 9
14
Programowanie GUI – Wykład 9
15
Programowanie GUI – Wykład 9
? Borland JBuilder
? IBM WebSphere (oparty na projekcie Eclipse)
16
Programowanie GUI – Wykład 9
17
Programowanie GUI – Wykład 9
? Oracle JDeveloper
? Xinox JCreator
18