java applet (c.d.)
DESCRIPTION
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. - PowerPoint PPT PresentationTRANSCRIPT
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); }}