240 likes | 402 Views
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.
E N 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(new 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ń)
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); Użycie BoxLayout
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 { publicvoid 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; }
Zdarzenia 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"); } } public 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; }
Interakcja - przykład rysownika 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; } } import 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 }
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 : publicclass 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 przezobiektźródłoZdarzeń, zarejestrowanoobiektobiektKlasyNasłuchującejimplementujący interfejs nasłuchującyxxxxxListener. typ nasłuchu, np.
Delegacyjny model obsługi zdarzeń • Implementacja metod z interfejsu nasłuchującego. • InterfejsActionListener posiada tylko jedną metodę do implementacji: public void actionPerformed(ActionEvent evt) { // deklaracja reakcji na zdarzenia }
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); } } Przykłady: