1DVG3 - eigene AWT-Komponenten Entwicklung eigener AWT-Komponenten.
-
Upload
rainer-raithel -
Category
Documents
-
view
139 -
download
2
Transcript of 1DVG3 - eigene AWT-Komponenten Entwicklung eigener AWT-Komponenten.
DVG3 - eigene AWT-Komponenten 1
Entwicklung eigenerAWT-Komponenten
DV
G3 - eig
ene A
WT
-Ko
mp
on
enten
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.
DV
G3 - eig
ene A
WT
-Ko
mp
on
enten
3
Eigenschaften von AWT-KomponentenGestaltung 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
DV
G3 - eig
ene A
WT
-Ko
mp
on
enten
4
BestandteileKomponentenspezifisch
Implementierung der Komponentenklasse
Für evtl. mehrere Komponenten
Event
Listener
Komponentenübergreifend
Multicaster für alle Events und Listener
DV
G3 - eig
ene A
WT
-Ko
mp
on
enten
5
Funktionsweise von AWT-Komponenten
Programm
AWT-KomponenteErzeugt AWT-Komponente
Erzeugt Listener-Objekt
Listener-Objekt
registriert Listener-Objekt
bei der AWT-Komponente
Ereignis
regi
stri
ere
n
ben
ach
rich
tige
n
DV
G3 - eig
ene A
WT
-Ko
mp
on
enten
6
ColorEventHerangehen
1. Beispiel aus AWT analysieren, Basisklassen beachten
2. Basisklassen erweitern
3. Eigene Klasse entwickeln
DV
G3 - eig
ene A
WT
-Ko
mp
on
enten
7
Beispiel: ActionEventpackage 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); }
DV
G3 - eig
ene A
WT
-Ko
mp
on
enten
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; }}
DV
G3 - eig
ene A
WT
-Ko
mp
on
enten
9
Basisklasse: AWTEventpackage 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;
DV
G3 - eig
ene A
WT
-Ko
mp
on
enten
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: } }..........
DV
G3 - eig
ene A
WT
-Ko
mp
on
enten
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.
DV
G3 - eig
ene A
WT
-Ko
mp
on
enten
12
Erweiterung: TFHEventpackage 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);
}
}
DV
G3 - eig
ene A
WT
-Ko
mp
on
enten
13
Neuer TFHEvent: ColorEventAls 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
DV
G3 - eig
ene A
WT
-Ko
mp
on
enten
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;
}
DV
G3 - eig
ene A
WT
-Ko
mp
on
enten
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;
}
}
DV
G3 - eig
ene A
WT
-Ko
mp
on
enten
16
Interface: ColorListenerBeschreibt 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)
DV
G3 - eig
ene A
WT
-Ko
mp
on
enten
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);
}
DV
G3 - eig
ene A
WT
-Ko
mp
on
enten
18
Basisklasse: AWTEventMulticasterMulticaster organisiert die Registrierung und Deregistrierung von EventListenern, sowie den Aufruf der entsprechenden Methoden der registrierten EventListener.Multicaster implementiert selbst alle EventListenerpublic class AWTEventMulticaster implements ComponentListener, ContainerListener, FocusListener,
KeyListener, MouseListener, MouseMotionListener,WindowListener, ActionListener, ItemListener,AdjustmentListener, TextListener,
InputMethodListener
Multicaster speichert registrierte EventListener in einer Listeprotected 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);
}
DV
G3 - eig
ene A
WT
-Ko
mp
on
enten
19
Typischer Aufruf in Buttontransient ActionListener actionListener;public synchronized void
addActionListener(ActionListener l) {if (l == null) { return; }actionListener =AWTEventMulticaster.add(actionListener, l);newEventsOnly = true;
}
Im Muticaster existiert dazugehörige Methodepublic static ActionListener add
(ActionListener a, ActionListener b) {return (ActionListener)addInternal(a, b);
}
DV
G3 - eig
ene A
WT
-Ko
mp
on
enten
20
actionListener=null
actionListener=
AWTEventMulticaster
l1 l2
actionListener=l1
actionListener=
AWTEventMulticaster
l3AWTEM
l1 l2
addActionListener(l1)
addActionListener(l2)
addActionListener(l3)
DV
G3 - eig
ene A
WT
-Ko
mp
on
enten
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
}
}
DV
G3 - eig
ene A
WT
-Ko
mp
on
enten
22
Typischer Aufruf in Button
public synchronized voidremoveActionListener(ActionListener l) {if (l == null) { return; }actionListener =AWTEventMulticaster.remove(actionListener, l);
}
Im Muticaster existiert dazugehörige Methodepublic static ActionListener remove
(ActionListener a, ActionListener b) {return (ActionListener)removeInternal(a, b);
}
DV
G3 - eig
ene A
WT
-Ko
mp
on
enten
23
Aufruf der Methoden des EventListeners im Multicaster:
public void actionPerformed(ActionEvent e) {((ActionListener)a).actionPerformed(e);((ActionListener)b).actionPerformed(e);
}
DV
G3 - eig
ene A
WT
-Ko
mp
on
enten
24
Erweiterung: TFHEventMulticasterAufgaben:
Konstruktor
Implementierung aller TFHEventListener (z.Z. ColorListener) durch die entsprechenden Methoden (colorChanged, colorSelected).
EventListener-spezifische add- und remove- Methoden implementieren
DV
G3 - eig
ene A
WT
-Ko
mp
on
enten
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);
}}
DV
G3 - eig
ene A
WT
-Ko
mp
on
enten
26
Eigene AWT-Komponente: ColorChooserZur komfortablen Definition von Farben.
DV
G3 - eig
ene A
WT
-Ko
mp
on
enten
27
BestandteileScrollbars 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.
DV
G3 - eig
ene A
WT
-Ko
mp
on
enten
28
Buttonso.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
DV
G3 - eig
ene A
WT
-Ko
mp
on
enten
29
Klasse: Scrollbar
Konstruktoren:Scrollbar(int orientation, int value, int visible, int minimum, int maximum)orintation = Scrollbar.HORIZONTAL oder = Scrollbar.VERTICALScrollbar(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
DV
G3 - eig
ene A
WT
-Ko
mp
on
enten
30
Methoden in ScrollbarListenerpublic void addAdjustmentListener(AdjustmentListener l)public void removeAdjustmentListener(AdjustmentListener l)
Hauptparameterpublic void setValues(int value, int visible, int minimum, int maximum)- sichert Konsistenzpublic 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()
InkrementeUnitInkrement beim Betätigen der Pfeile an den EndenStandard : 1public void setUnitIncrement(int incr)public int getUnitIncrement()
BlockInkrement beim Klicken auf die Flächen neben dem SchieberStandard : visiblepublic void setBlockIncrement(int incr)public int getBlockIncrement()
DV
G3 - eig
ene A
WT
-Ko
mp
on
enten
31
AdjustmentEventMethoden
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
DV
G3 - eig
ene A
WT
-Ko
mp
on
enten
32
AdjustmentListenerListener-Interface der auf AdjustmentEvents reagiert
Methode:public void adjustmentValueChanged
(AdjustmentEvent e)
DV
G3 - eig
ene A
WT
-Ko
mp
on
enten
33
TextFieldStellt 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 setzenpublic int getColumns()public void setColumns(int columns)
Text lesen und schreibenpublic String getText()public void setText(String text)
Cursor-Position bestimmen und setzenpublic int getCaretPosition()public void setCaretPosition(int position)
DV
G3 - eig
ene A
WT
-Ko
mp
on
enten
34
Editierbarkeit abfragen und setzenpublic boolean isEditable()public void setEditable(boolean b)
Text selektieren und selektierten Text lesenpublic void select(int start, int end)public int getSelectionStart()public int getSelectionEnd()public String getSelectedText()
Echozeichen abfragen und setzenpublic boolean echoCharIsSet()public char getEchoChar()public void setEchoChar(char c)c=='\0' kein Echozeichen aktiv
Listener registrieren und derigistrierenpublic void addTextListener(TextListener l)public void removeTextListener(TextListener l) public void addActionListener(ActionListener l)public void removeActionListener(ActionListener l)
DV
G3 - eig
ene A
WT
-Ko
mp
on
enten
35
TextEventTextEvent wird in TextField und TextArea ausgelöst, wenn der Text geändert wird. ActionEvents werden ausgelöst, wenn im TextField <RETURN> 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();
DV
G3 - eig
ene A
WT
-Ko
mp
on
enten
36
TextListenerInterface zur Behandlung von TextEvents.
Einzige Methode:public void textValueChanged(TextEvent e)wird aufgerufen, wenn der Inhalt des Textfields geändert wird