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

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

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

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

DVG3 - eigene AWT-Komponenten 1

Entwicklung eigenerAWT-Komponenten

Page 2: 1DVG3 - eigene AWT-Komponenten Entwicklung eigener AWT-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.

Page 3: 1DVG3 - eigene AWT-Komponenten Entwicklung eigener AWT-Komponenten.

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

Page 4: 1DVG3 - eigene AWT-Komponenten Entwicklung eigener AWT-Komponenten.

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

Page 5: 1DVG3 - eigene AWT-Komponenten Entwicklung eigener AWT-Komponenten.

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

Page 6: 1DVG3 - eigene AWT-Komponenten Entwicklung eigener AWT-Komponenten.

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

Page 7: 1DVG3 - eigene AWT-Komponenten Entwicklung eigener AWT-Komponenten.

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

Page 8: 1DVG3 - eigene AWT-Komponenten Entwicklung eigener AWT-Komponenten.

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

Page 9: 1DVG3 - eigene AWT-Komponenten Entwicklung eigener AWT-Komponenten.

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;

Page 10: 1DVG3 - eigene AWT-Komponenten Entwicklung eigener AWT-Komponenten.

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

Page 11: 1DVG3 - eigene AWT-Komponenten Entwicklung eigener AWT-Komponenten.

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.

Page 12: 1DVG3 - eigene AWT-Komponenten Entwicklung eigener AWT-Komponenten.

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

}

}

Page 13: 1DVG3 - eigene AWT-Komponenten Entwicklung eigener AWT-Komponenten.

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

Page 14: 1DVG3 - eigene AWT-Komponenten Entwicklung eigener AWT-Komponenten.

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;

}

Page 15: 1DVG3 - eigene AWT-Komponenten Entwicklung eigener AWT-Komponenten.

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;

}

}

Page 16: 1DVG3 - eigene AWT-Komponenten Entwicklung eigener AWT-Komponenten.

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)

Page 17: 1DVG3 - eigene AWT-Komponenten Entwicklung eigener AWT-Komponenten.

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

}

Page 18: 1DVG3 - eigene AWT-Komponenten Entwicklung eigener AWT-Komponenten.

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

}

Page 19: 1DVG3 - eigene AWT-Komponenten Entwicklung eigener AWT-Komponenten.

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

}

Page 20: 1DVG3 - eigene AWT-Komponenten Entwicklung eigener AWT-Komponenten.

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)

Page 21: 1DVG3 - eigene AWT-Komponenten Entwicklung eigener AWT-Komponenten.

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

}

}

Page 22: 1DVG3 - eigene AWT-Komponenten Entwicklung eigener AWT-Komponenten.

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

}

Page 23: 1DVG3 - eigene AWT-Komponenten Entwicklung eigener AWT-Komponenten.

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

}

Page 24: 1DVG3 - eigene AWT-Komponenten Entwicklung eigener AWT-Komponenten.

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

Page 25: 1DVG3 - eigene AWT-Komponenten Entwicklung eigener AWT-Komponenten.

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

}}

Page 26: 1DVG3 - eigene AWT-Komponenten Entwicklung eigener AWT-Komponenten.

DV

G3 - eig

ene A

WT

-Ko

mp

on

enten

26

Eigene AWT-Komponente: ColorChooserZur komfortablen Definition von Farben.

Page 27: 1DVG3 - eigene AWT-Komponenten Entwicklung eigener AWT-Komponenten.

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.

Page 28: 1DVG3 - eigene AWT-Komponenten Entwicklung eigener AWT-Komponenten.

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

Page 29: 1DVG3 - eigene AWT-Komponenten Entwicklung eigener AWT-Komponenten.

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

Page 30: 1DVG3 - eigene AWT-Komponenten Entwicklung eigener AWT-Komponenten.

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()

Page 31: 1DVG3 - eigene AWT-Komponenten Entwicklung eigener AWT-Komponenten.

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

Page 32: 1DVG3 - eigene AWT-Komponenten Entwicklung eigener AWT-Komponenten.

DV

G3 - eig

ene A

WT

-Ko

mp

on

enten

32

AdjustmentListenerListener-Interface der auf AdjustmentEvents reagiert

Methode:public void adjustmentValueChanged

(AdjustmentEvent e)

Page 33: 1DVG3 - eigene AWT-Komponenten Entwicklung eigener AWT-Komponenten.

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)

Page 34: 1DVG3 - eigene AWT-Komponenten Entwicklung eigener AWT-Komponenten.

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)

Page 35: 1DVG3 - eigene AWT-Komponenten Entwicklung eigener AWT-Komponenten.

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

Page 36: 1DVG3 - eigene AWT-Komponenten Entwicklung eigener AWT-Komponenten.

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