1 / 24

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.

alida
Download Presentation

Java applet (c.d.)

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


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

  2. Tematy • Rozmieszczenie komponentów • Obsługi zdarzeń • Przykłady

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

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

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

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

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

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

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

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

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

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

  13. CardLayout • rozmieszczenie kartkowe; • komponenty rozmieszczane są na wzajemnie zasłaniających się kartkach.

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

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

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

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

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

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

  20. 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 }

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

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

  23. 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 }

  24. 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:

More Related