Java applet (c.d.)
description
Transcript of Java applet (c.d.)
Java applet (c.d.)
Nguyen Hung Son
Uniwersytet Warszawski
Tematy
Rozmieszczenie komponentów Obsługi zdarzeń Przykłady
Rozmieszczanie komponentów
Obsługa poszczególnych komponentów jest prosta. Definiujemy: właściwości komponentu oraz jego reakcje na generowane zdarzenia
Rozmieszczenie komponentów
Zarządca rozmieszczenia (ang. Layout Manager): Pojemnik rozmieszcza nowo elementy zgodnie z
przypisanym do niego Layout Manager Layout Manager określa sposób wyświetlania
komponentów dołączonych do pojemnika
Przykład: public void init() {... setLayout(setLayout(newnew BorderLayout()) BorderLayout());;add("South", panel);add("North", btnZerowanie);add("Center", lblWartosc);
Typy rozmieszczenia
Można komponety umieścić według następujących schematów: FlowLayout BorderLayout GridLayout GridBagLayout CardLayout
FlowLayout:
ciągłe rozmieszczenie elementów: jednego za drugim;
gdy dany komponent nie mieści się w wierszu, przenoszony jest do następnego wiersza, np.
...setLayout(new FlowLayout()); for(int i = 0; i < 20; i++)
add(new Button("Button " + i)); ...
BorderLayout: rozmieszczenie brzegowe, polega na rozmieszczeniu
komponentów na obrzeżach i w środku pojemnika; miejsca umieszczenia w pojemniku określane są za pomocą
nazw stron świata: West, East, North, South, Center;
nazywane jest także rozmieszczeniem grawitacyjnym. Np.
public void init() {setLayout(new BorderLayout());add(BorderLayout.NORTH, new Button("Północ"));
add(BorderLayout.SOUTH, new Button("Południe")); add(BorderLayout.EAST, new Button("Wschód")); add(BorderLayout.WEST, new Button("Zachód")); add(BorderLayout.CENTER, new Button("Środek")); }
GridLayout
rozmieszczenie siatkowe, rozmieszczenie komponentów w prostokątnej
siatce o podanej liczbie kolumn i wierszy; wszystkie klatki tej siatki mają identyczne
rozmiary, np....setLayout(new GridLayout(7,3)); for(int i = 0; i < 20; i++)
add(new Button("Button " + i)); ...
GridBagLayout
rozmieszczenie "torebkowe", komponenty rozmieszczane są w prostokątnym
układzie torebek o podanych rozmiarach; jednak rozmiary torebek nie muszą być identyczne -
jak w przypadku GridLayut; sposób rozmieszczenia elementów w torebkach
określa obiekt typu GridBagConstraints definiujący więzy (ang. constraints).
BoxLayout
Wiele programistów mają kłopot z użyciem GridBagLayout
W pakiecie javax.swing.* zaoferowano prostsze rozwiązanie: BoxLayout; Rozmieszcza komponenty poziomo lub pionowo Przestrzeń między komponentami są kontrowane
za pomocą struts (pręty) i glue (guma lub sprężyna) i rigid (sztywna przestrzeń)
Użycie BoxLayout Konstruktor BoxLayout:
Panel pion = new Panel();pion.setLayout(new BoxLayout(pion,
BoxLayout.Y_AXIS));for (int i = 0; i < 5; i++)pion.add(new Button(„pion "+i));
Panel poz = new Panel();poz.setLayout(new BoxLayout(poz,
BoxLayout.X_AXIS));for (int i = 0; i < 5; i++)poz.add(new Button("jph " + i));
setLayout(new BorderLayout());add(BorderLayout.WEST, pion);add(BorderLayout.NORTH, poz);
Udogodnienie: Box Dwie statyczne metody:
Box.createVerticalBox(); Box.createHorizontalBox();
Np.Box bv = Box.createVerticalBox();for(int i = 0; i < 5; i++) bv.add(new JButton(„pion " + i));
Box bh = Box.createHorizontalBox();for(int i = 0; i < 5; i++) bh.add(new JButton(„poz " + i));
setLayout(new BorderLayout());add(BorderLayout.EAST, bv);add(BorderLayout.SOUTH, bh);
Strut, glue czy regid?Box bh = Box.createHorizontalBox();for (int i = 0; i < 4; i++){
bh.add(new Button("bh " + i));bh.add(Box.createHorizontalGlue());
}
Box bv = Box.createVerticalBox();for (int i = 0; i < 5; i++) {
bv.add(new Button("bv " + i));bv.add(Box.createVerticalStrut(i*10));
}
bv.add(Box.createRigidArea(new Dimension(120, 40)));
bv.add(bh);setLayout(new BorderLayout());add(BorderLayout.SOUTH, bv);
CardLayout
rozmieszczenie kartkowe; komponenty rozmieszczane są na wzajemnie
zasłaniających się kartkach.
Domyślne rozmieszczenie
Podczas tworzenia pojemnika przypisany jest mu zarządca domyślny dla apletu i panelu - FlowLayout dla okna ( Window) i ramki ( Frame) - BorderLayout.
Obsługi zdarzeń
Interakcja z użytkownikiem; Użytkownik kontaktuje się z appletem przez
urządzenie zewnętrzne: Klawiatura Myszka
Istnieją dwa modele obsługi zdarzeń: Tradycyjny model:
Implementowany w JDK 1.0; niezalecany (deprecated) w obecnej wersji;
Delegacyjny model: preferowany zamiast tradycyjnego modelu
Tradycyjny model obsługi zdarzeń
Tradycyjny model obsługi zdarzeń jest oparty o dziedziczenie.
Zdarzenie, po swoim wystąpieniu dla obiektu danej klasy, jest: albo obsługiwane przez metodę:
action (zdarzenia generowane przez użytkownika) handleEvent (zdarzenia generowane przez komponenty
graficzne); keyDown, keyUp, ... mouseDown, mouseUp, mouseGrag, ...
lub przekazane do klasy nadrzędnej.
Tradycyjny model: metoda action(Event, Object)public boolean action(Event evt, Object arg) {
// Gdy nacisnieto przycisk btnNastepna if (evt.target == btnNastepna) {
lblWartosc.setText(Integer.toString(++m_nWartosc)); return true;
} else if (evt.target == btnPoprzednia) {
lblWartosc.setText(Integer.toString(--m_nWartosc)); return true;
} else if (evt.target == btnZerowanie) {
m_nWartosc = 0; lblWartosc.setText(Integer.toString(m_nWartosc)); return true;
} return false;
}
Zdarzenia w Appletach
import java.applet.Applet;import java.awt.*;
public class EventTutor extends Applet { public void init() { System.out.println("init event"); } public void start() { System.out.println("start event"); } public void destroy() { System.out.println("destroy event"); }
public void paint(Graphics g) { System.out.println("paint event"); } public void update(Graphics g) { System.out.println("update event"); }
public boolean keyDown(Event e, int x){ System.out.println("The " + (char) x +
" key was pressed."); return true; }
Zdarzeniapublic boolean mouseUp(Event e, int x, int y) { System.out.println("mouseUp event"); return false; } public boolean mouseDown(Event e,int x,int y){ System.out.println("mouseDown event"); return false; }public boolean mouseDrag(Event e,int x,int y) { System.out.println("mouseDrag event"); return false; } public boolean mouseMove(Event e,int x,int y) { System.out.println("mouseMove event"); return false; }
public boolean mouseEnter(Event e,int x,int y) { System.out.println("mouseEnter event"); return false; }public boolean mouseExit(Event e,int x,int y) { System.out.println("mouseExit event"); return false; }public void getFocus() { System.out.println("getFocus event"); }public void gotFocus() { System.out.println("gotFocus event"); }public void lostFocus() { System.out.println("lostFocus event"); }}
Interakcja - przykład rysownikaimport java.applet.Applet;import java.awt.*;import java.util.Vector;
public class Rysownik extends Applet { Vector points = new Vector();
public void paint(Graphics g) { int x1, y1, x2, y2; Point tempPoint; if (points.size() > 1) { tempPoint = (Point) points.elementAt(0);
x1 = tempPoint.x; y1 = tempPoint.y; for (int i = 1; i < points.size(); i++) { tempPoint = (Point)points.elementAt(i);
x2 = tempPoint.x; y2 = tempPoint.y; g.drawLine(x1, y1, x2, y2); x1 = x2; y1 = y2; } // end for } // end if }
public boolean mouseDown(Event e,int x,int y){ points.addElement(new Point(x, y)); return true; }
public boolean mouseDrag(Event e, int x, int y) { points.addElement(new Point(x, y)); repaint(); return true;}
public boolean mouseUp(Event e, int x, int y) { points.addElement(new Point(x, y)); repaint(); return true; }}
Delegacyjny model obsługi zdarzeń
Deklaracja klasy (przeznaczonej do obsługi) implementującej odpowiedni interfejs
nasłuchujący lub dziedziczącej z klasy, która to implementuje.
Przykład : public class MojAplet extends Applet
implements ActionListener
Delegacyjny model obsługi zdarzeń
Rejestracja dla danego komponentu obiektu klasy nasłuchującej.
Ogólnie, napis: źródłoZdarzeń.addxxxxListener(obiektKlasyNasł
uchującej);oznacza, że dla obsługi zdarzeń generowanych przez obiekt źródłoZdarzeń, zarejestrowano obiekt obiektKlasyNasłuchującej implementujący interfejs nasłuchujący xxxxxListener.
typ nasłuchu, np.
Delegacyjny model obsługi zdarzeń
Implementacja metod z interfejsu nasłuchującego. Interfejs ActionListener posiada tylko jedną
metodę do implementacji: public void actionPerformed(ActionEvent evt){
// deklaracja reakcji na zdarzenia}
Przykłady:import java.applet.Applet;import java.awt.event.*;import java.awt.*;
public class listener extends Applet {private Button b1 = new Button("Button 1"), b2 = new Button("Button 2");private TextField txt = new TextField(10);
private ButtonListener bl = new ButtonListener();
public void init() {b1.addActionListener(bl);b2.addActionListener(bl);this.setLayout(new FlowLayout());this.add(b1);this.add(b2);this.add(txt);
}}
class ButtonListener implements ActionListener { public void actionPerformed(ActionEvent e) { String name;
name = ((Button)e.getSource()).getLabel(); txt.setText(name); }}