java applet (c.d.)

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

Upload: alida

Post on 30-Jan-2016

51 views

Category:

Documents


0 download

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

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