Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

1DVG3 - eigene AWT-Komponenten Entwicklung eigener AWT-Komponenten.

Ähnliche Präsentationen


Präsentation zum Thema: "1DVG3 - eigene AWT-Komponenten Entwicklung eigener AWT-Komponenten."—  Präsentation transkript:

1 1DVG3 - eigene AWT-Komponenten Entwicklung eigener AWT-Komponenten

2 DVG3 - eigene AWT-Komponenten 2 Warum eigene AWT-Komponenten? Vorhanden AWT-Komponenten erfüllen nicht die gestellten Anforderungen. Z.B.: FileNameFilter in FileDialog funktioniert nicht richtig. Keine Vorschau im FileDialog möglich. Keine Komponente zur Wahl von Farben oder zur Formatierung von Texten vorhanden. In einem Projekt werden häufig komplexere Komponenten benötigt. Einheitliche Erscheinung der Teile eines Projektes soll gewährleistet werden. Arbeitsteilung bei der Bearbeitung von Projekten soll gefördert werden. Experten für GUIs und Experten für Numerik sollen ein gemeinsames Projekt erstellen.

3 DVG3 - eigene AWT-Komponenten 3 Eigenschaften von AWT-Komponenten Gestaltung der Komponente Kommunikation mit anderen Objekten durch Events und/oder Methoden. Z.B.: Checkbox Event: ItemEvent Methode: getState() Label Methoden: getLabel() Button Event: ActionEvent Erzeugung von spezifischen Events Komponente erlaubt die Registrierung von Listenern Komponente ruft die entsprechenden Methoden der registrierten Listener auf Komponente kann selbst auf Events reagieren um bestimmte Funktionen zu realisieren

4 DVG3 - eigene AWT-Komponenten 4 Bestandteile Komponentenspezifisch Implementierung der Komponentenklasse Für evtl. mehrere Komponenten Event Listener Komponentenübergreifend Multicaster für alle Events und Listener

5 DVG3 - eigene AWT-Komponenten 5 Funktionsweise von AWT-Komponenten Programm AWT-KomponenteErzeugt AWT-Komponente Erzeugt Listener-Objekt Listener-Objekt registriert Listener-Objekt bei der AWT-Komponente Ereignis registrieren benachrichtigen

6 DVG3 - eigene AWT-Komponenten 6 ColorEvent Herangehen 1.Beispiel aus AWT analysieren, Basisklassen beachten 2.Basisklassen erweitern 3.Eigene Klasse entwickeln

7 DVG3 - eigene AWT-Komponenten 7 Beispiel: ActionEvent package java.awt.event; import java.awt.AWTEvent; import java.awt.Event; public class ActionEvent extends AWTEvent { public static final int SHIFT_MASK= Event.SHIFT_MASK; public static final int CTRL_MASK= Event.CTRL_MASK; public static final int META_MASK= Event.META_MASK; public static final int ALT_MASK= Event.ALT_MASK; public static final int ACTION_FIRST= 1001; public static final int ACTION_LAST= 1001; public static final int ACTION_PERFORMED= ACTION_FIRST; String actionCommand; int modifiers; private static final long serialVersionUID = -7671078796273832149L; public ActionEvent(Object source, int id, String command) { this(source, id, command, 0); }

8 DVG3 - eigene AWT-Komponenten 8 public ActionEvent(Object source, int id, String command, int modifiers) { super(source, id); this.actionCommand = command; this.modifiers = modifiers; } public String getActionCommand() { return actionCommand; } public int getModifiers() { return modifiers; } public String paramString() { String typeStr; switch(id) { case ACTION_PERFORMED: typeStr = "ACTION_PERFORMED"; break; default: typeStr = "unknown type"; } return typeStr + ",cmd="+actionCommand; } }

9 DVG3 - eigene AWT-Komponenten 9 Basisklasse: AWTEvent package java.awt; import java.util.EventObject; import java.awt.event.*; public abstract class AWTEvent extends EventObject { private transient long data; protected int id; protected boolean consumed = false; public final static long COMPONENT_EVENT_MASK = 0x01; public final static long CONTAINER_EVENT_MASK = 0x02; public final static long FOCUS_EVENT_MASK = 0x04; public final static long KEY_EVENT_MASK = 0x08; public final static long MOUSE_EVENT_MASK = 0x10; public final static long MOUSE_MOTION_EVENT_MASK = 0x20; public final static long WINDOW_EVENT_MASK = 0x40; public final static long ACTION_EVENT_MASK = 0x80; public final static long ADJUSTMENT_EVENT_MASK = 0x100; public final static long ITEM_EVENT_MASK = 0x200; public final static long TEXT_EVENT_MASK = 0x400; public final static long INPUT_METHOD_EVENT_MASK = 0x800; final static long INPUT_METHODS_ENABLED_MASK = 0x1000;

10 DVG3 - eigene AWT-Komponenten 10 public final static int RESERVED_ID_MAX = 1999; public AWTEvent(Event event) { this(event.target, event.id); } public AWTEvent(Object source, int id) { super(source); this.id = id; switch(id) { case ActionEvent.ACTION_PERFORMED: case ItemEvent.ITEM_STATE_CHANGED: case AdjustmentEvent.ADJUSTMENT_VALUE_CHANGED: case TextEvent.TEXT_VALUE_CHANGED: consumed = true; break; default: } }..........

11 DVG3 - eigene AWT-Komponenten 11 Für jede Eventgruppe existiert eine Maske. Diese dient zum gezielten aktivieren bzw. deaktivieren der Eventgruppe. Wird bei der Entwicklung von eigenen Komponenten benötigt (3. Variante der Eventbehandlung). Maske enthält ein bit=1 alle anderen =0. Bei einer Erweiterung muss für jede neue Eventgruppe eine neue Maske definiert werden. Z.B.: public final static long COLOR_EVENT_MASK = 0x2000; Jeder Event erhält einen eigenen ID. public final static int RESERVED_ID_MAX = 1999; Für eigene Events können IDs ab 2000 benutzt werden. Wir erhöhen die Anzahl der reservierten IDs um 2000 und benutzen für TFHEvents die IDs 2000...3999. Konstruktoren müssen in der abgeleiteten Klasse nachgebildet werden.

12 DVG3 - eigene AWT-Komponenten 12 Erweiterung: TFHEvent package tfh.awt; import java.awt.AWTEvent; public abstract class TFHEvent extends AWTEvent { public final static long COLOR_EVENT_MASK = 0x2000; public final static int RESERVED_ID_MAX = AWTEvent.RESERVED_ID_MAX+2000; public TFHEvent(Event event) { super(event); } public TFHEvent(Object source, int id) { super(source,id); } }

13 DVG3 - eigene AWT-Komponenten 13 Neuer TFHEvent: ColorEvent Als Daten muss die Farbe, d.h. ein Color-Objekt gespeichert werden. Für das gespeicherte Color-Objekt muss eine Abfrage-Methode vorhanden sein (analog MouseEvent.getX()). Zwei Varianten (IDs): 1.Farbe wird temporär geändert (analog MouseMoved). COLOR_CHANGED 2.Farbe wird ausgewählt (analog MouseClicked). COLOR_SELECTED

14 DVG3 - eigene AWT-Komponenten 14 package tfh.awt.event; import tfh.awt.TFHEvent; import java.awt.AWTEvent; import java.awt.Color; public class ColorEvent extends TFHEvent { public static final int COLOR_FIRST= AWTEvent.RESERVED_ID_MAX+1; public static final int COLOR_LAST= AWTEvent.RESERVED_ID_MAX+2; public final static int COLOR_CHANGED= COLOR_FIRST; public final static int COLOR_SELECTED= COLOR_FIRST+1; Color color; public ColorEvent(Object source, int id, Color color) { super(source, id); this.color = color; }

15 DVG3 - eigene AWT-Komponenten 15 public Color getColor() { return color; } public String paramString() { String typeStr; switch(id) { case COLOR_CHANGED: typeStr = "COLOR_CHANGED"; break; case COLOR_SELECTED: typeStr = "COLOR_SELECTED"; break; default: typeStr = "unknown type"; } return typeStr + ",color="+color; } }

16 DVG3 - eigene AWT-Komponenten 16 Interface: ColorListener Beschreibt die Methoden, die aufgerufen werden müssen um die ColorEvnts zu behandeln. Zwei Varianten: 1.COLOR_CHANGED: colorChanged(ColorEvent e) 2.COLOR_SELECTED: colorSelected(ColorEvent e)

17 DVG3 - eigene AWT-Komponenten 17 package tfh.awt.event; import tfh.awt.event.ColorEvent; public interface ColorListener extends java.util.EventListener { public void colorChanged (ColorEvent e); public void colorSelected (ColorEvent e); }

18 DVG3 - eigene AWT-Komponenten 18 Basisklasse: AWTEventMulticaster Multicaster organisiert die Registrierung und Deregistrierung von EventListenern, sowie den Aufruf der entsprechenden Methoden der registrierten EventListener. Multicaster implementiert selbst alle EventListener public class AWTEventMulticaster implements ComponentListener, ContainerListener, FocusListener, KeyListener, MouseListener, MouseMotionListener, WindowListener, ActionListener, ItemListener, AdjustmentListener, TextListener, InputMethodListener Multicaster speichert registrierte EventListener in einer Liste protected final EventListener a, b; protected AWTEventMulticaster (EventListener a, EventListener b){ this.a = a; this.b = b; } protected static EventListener addInternal(EventListener a, EventListener b) { if (a == null) return b; if (b == null) return a; return new AWTEventMulticaster(a, b); }

19 DVG3 - eigene AWT-Komponenten 19 Typischer Aufruf in Button transient ActionListener actionListener; public synchronized void addActionListener(ActionListener l) { if (l == null) { return; } actionListener = AWTEventMulticaster.add(actionListener, l); newEventsOnly = true; } Im Muticaster existiert dazugehörige Methode public static ActionListener add (ActionListener a, ActionListener b) { return (ActionListener)addInternal(a, b); }

20 DVG3 - eigene AWT-Komponenten 20 actionListener=null actionListener= AWTEventMulticaster l1l2 actionListener=l1 actionListener= AWTEventMulticaster l3 AWTEM l1l2 addActionListener(l1) addActionListener(l2) addActionListener(l3)

21 DVG3 - eigene AWT-Komponenten 21 Löschen eines EventListeners protected EventListener remove(EventListener oldl) { if (oldl == a) return b; if (oldl == b) return a; EventListener a2 = removeInternal(a, oldl); EventListener b2 = removeInternal(b, oldl); if (a2 == a && b2 == b) { return this;// it's not here } return addInternal(a2, b2); } protected static EventListener removeInternal(EventListener l, EventListener oldl) { if (l == oldl || l == null) { return null; } else if (l instanceof AWTEventMulticaster) { return ((AWTEventMulticaster)l).remove(oldl); } else { return l;// it's not here } }

22 DVG3 - eigene AWT-Komponenten 22 Typischer Aufruf in Button public synchronized void removeActionListener(ActionListener l) { if (l == null) { return; } actionListener = AWTEventMulticaster.remove(actionListener, l); } Im Muticaster existiert dazugehörige Methode public static ActionListener remove (ActionListener a, ActionListener b) { return (ActionListener)removeInternal(a, b); }

23 DVG3 - eigene AWT-Komponenten 23 Aufruf der Methoden des EventListeners im Multicaster: public void actionPerformed(ActionEvent e) { ((ActionListener)a).actionPerformed(e); ((ActionListener)b).actionPerformed(e); }

24 DVG3 - eigene AWT-Komponenten 24 Erweiterung: TFHEventMulticaster Aufgaben: Konstruktor Implementierung aller TFHEventListener (z.Z. ColorListener ) durch die entsprechenden Methoden ( colorChanged, colorSelected ). EventListener-spezifische add- und remove- Methoden implementieren

25 DVG3 - eigene AWT-Komponenten 25 package tfh.awt; import tfh.awt.event.ColorEvent; import tfh.awt.event.ColorListener; import java.util.EventListener; import java.awt.AWTEventMulticaster; public class TFHEventMulticaster extends AWTEventMulticaster implements ColorListener { protected TFHEventMulticaster(EventListener a, EventListener b) { super(a,b); } public void colorChanged(ColorEvent e) { ((ColorListener)a).colorChanged(e); ((ColorListener)b).colorChanged(e); } public void colorSelected(ColorEvent e) { ((ColorListener)a).colorSelected(e); ((ColorListener)b).colorSelected(e); } public static ColorListener add (ColorListener a, ColorListener b) { return (ColorListener)addInternal(a, b); } public static ColorListener remove (ColorListener l, ColorListener oldl) { return (ColorListener)removeInternal(l, oldl); } }

26 DVG3 - eigene AWT-Komponenten 26 Eigene AWT-Komponente: ColorChooser Zur komfortablen Definition von Farben.

27 DVG3 - eigene AWT-Komponenten 27 Bestandteile Scrollbars zur Einstellung der Farbe Textfelder zum Eingeben der Farbe (Rot-, Grün, Blauanteile) Labels zur Kennzeichnung Buttons zur Modifikation der eingestellten Farbe (heller, dunkler). Buttons zur Auswahl von Standardfarben und wiederholt benötigten Farben. Buttons zur Steuerung (o.k., reset, cancel, show) Problem: Scrollbars, Textfelder, Buttons müssen immer konsistent eingestellt sein, d.h. Änderungen durch eine Komponente müssen in den anderen Komponenten wiedergespiegelt werden. Wenn die Farbe mittels Scrollbars, Textfelder oder Farbbuttons geändert wird, wird ein COLOR_CHANGED-Event ausgelöst. Wenn die Farbe mittels o.k. oder cancel-Button geändert wird, wird ein COLOR_SELECTED-Event ausgelöst.

28 DVG3 - eigene AWT-Komponenten 28 Buttons o.k. – Farbe wird übernommen und COLOR_SELECTED-Event ausgelöst darker/brighter – etwas hellere/dunklere Farbe wird eingestellt und COLOR_CHANGED-Event ausgelöst show – Alle Komponenten im Fenster werden gelöscht und nur ein x- Button angezeigt reset – Farbe wird auf die Anfangsfarbe gesetzt und der COLOR_CHANGED-Event ausgelöst cancel – Farbe wird auf die Anfangsfarbe gesetzt und der COLOR_SELECTED-Event ausgelöst Farbbuttons – Anwahl von Standardfarben und schon einmal ausgewählten Farben

29 DVG3 - eigene AWT-Komponenten 29 Klasse: Scrollbar Konstruktoren: Scrollbar(int orientation, int value, int visible, int minimum, int maximum) orintation = Scrollbar.HORIZONTAL oder = Scrollbar.VERTICAL Scrollbar(int orientation) = Scrollbar(orientation, 0, 10, 0, 100) Scrollbar() = Scrollbar(Scrollbar.VERTICAL, 0, 10, 0, 100) Achtung: Es können nur Wert minimum <= x <= maximum- visible eingestellt werden. minimum value maximum visible

30 DVG3 - eigene AWT-Komponenten 30 Methoden in Scrollbar Listener public void addAdjustmentListener(AdjustmentListener l) public void removeAdjustmentListener(AdjustmentListener l) Hauptparameter public void setValues(int value, int visible, int minimum, int maximum)- sichert Konsistenz public void setValue(int value) public void setVisibleAmount(int visible) public void setMinimum(int minimum) public void setMaximum(int maximum) public int getValue() public int getVisibleAmount() public int getMinimum() public int getMaximum() Inkremente UnitInkrement beim Betätigen der Pfeile an den Enden Standard : 1 public void setUnitIncrement(int incr) public int getUnitIncrement() BlockInkrement beim Klicken auf die Flächen neben dem Schieber Standard : visible public void setBlockIncrement(int incr) public int getBlockIncrement()

31 DVG3 - eigene AWT-Komponenten 31 AdjustmentEvent Methoden public Adjustable getAdjustable() liefert das Objekt, das den Event ausgelöst hat public int getAdjustmentType() liefert den Typ des Events: UNIT_INCREMENT, UNIT_DECREMENT, BLOCK_INCREMENT, BLOCK_DECREMENT, TRACK public int getValue() liefert den eingestellten Wert public String paramString() beschreibt den Event

32 DVG3 - eigene AWT-Komponenten 32 AdjustmentListener Listener-Interface der auf AdjustmentEvents reagiert Methode: public void adjustmentValueChanged (AdjustmentEvent e)

33 DVG3 - eigene AWT-Komponenten 33 TextField Stellt ein einzeiliges Feld zur Anzeige und Eingabe von Text zur Verfügung (mehrzeiliges Feld : TextArea ). Konstruktoren public TextField(String text, int columns) TextField mit Text text und Breite columns TextField(columns) = TextField("",columns) TextField(text) = TextField(text,text.length()) TextField() = TextField("",0) Methoden Breite bestimmen und setzen public int getColumns() public void setColumns(int columns) Text lesen und schreiben public String getText() public void setText(String text) Cursor-Position bestimmen und setzen public int getCaretPosition() public void setCaretPosition(int position)

34 DVG3 - eigene AWT-Komponenten 34 Editierbarkeit abfragen und setzen public boolean isEditable() public void setEditable(boolean b) Text selektieren und selektierten Text lesen public void select(int start, int end) public int getSelectionStart() public int getSelectionEnd() public String getSelectedText() Echozeichen abfragen und setzen public boolean echoCharIsSet() public char getEchoChar() public void setEchoChar(char c) c=='\0' kein Echozeichen aktiv Listener registrieren und derigistrieren public void addTextListener(TextListener l) public void removeTextListener(TextListener l) public void addActionListener(ActionListener l) public void removeActionListener(ActionListener l)

35 DVG3 - eigene AWT-Komponenten 35 TextEvent TextEvent wird in TextField und TextArea ausgelöst, wenn der Text geändert wird. ActionEvents werden ausgelöst, wenn im TextField gedrückt wird. TextEvents haben keine wesentlichen eigenen Methoden: Mit getSource() kann das Objekt bestimmt werden, in dem der Event aufgetreten ist. Anschließend kann mit object.getText() der Text gelesen werden. TextField tf = (TextField)(e.getSource()); String text = tf.getText();

36 DVG3 - eigene AWT-Komponenten 36 TextListener Interface zur Behandlung von TextEvents. Einzige Methode: public void textValueChanged(TextEvent e) wird aufgerufen, wenn der Inhalt des Textfields geändert wird


Herunterladen ppt "1DVG3 - eigene AWT-Komponenten Entwicklung eigener AWT-Komponenten."

Ähnliche Präsentationen


Google-Anzeigen