Java applet (c.d.)

24
Java applet (c.d.) Nguyen Hung Son Uniwersytet Warszawski

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 Presentation

Transcript of Java applet (c.d.)

Page 1: Java applet (c.d.)

Java applet (c.d.)

Nguyen Hung Son

Uniwersytet Warszawski

Page 2: Java applet (c.d.)

Tematy

Rozmieszczenie komponentów Obsługi zdarzeń Przykłady

Page 3: Java applet (c.d.)

Rozmieszczanie komponentów

Obsługa poszczególnych komponentów jest prosta. Definiujemy: właściwości komponentu oraz jego reakcje na generowane zdarzenia

Page 4: Java applet (c.d.)

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);

Page 5: Java applet (c.d.)

Typy rozmieszczenia

Można komponety umieścić według następujących schematów: FlowLayout BorderLayout GridLayout GridBagLayout CardLayout

Page 6: Java applet (c.d.)

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)); ...

Page 7: Java applet (c.d.)

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")); }

Page 8: Java applet (c.d.)

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)); ...

Page 9: Java applet (c.d.)

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).

Page 10: Java applet (c.d.)

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ń)

Page 11: Java applet (c.d.)

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);

Page 12: Java applet (c.d.)

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);

Page 13: Java applet (c.d.)

CardLayout

rozmieszczenie kartkowe; komponenty rozmieszczane są na wzajemnie

zasłaniających się kartkach.

Page 14: Java applet (c.d.)

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.

Page 15: Java applet (c.d.)

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

Page 16: Java applet (c.d.)

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.

Page 17: Java applet (c.d.)

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;

}

Page 18: Java applet (c.d.)

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; }

Page 19: Java applet (c.d.)

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"); }}

Page 20: Java applet (c.d.)

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; }}

Page 21: Java applet (c.d.)

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

Page 22: Java applet (c.d.)

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.

Page 23: Java applet (c.d.)

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}

Page 24: Java applet (c.d.)

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); }}