JavaBeans

Werbung
JavaBeans
Grundlagen
Eigenschaften
Ereignisse
Konfiguration
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
1
Begriffsdefinition
"A JavaBean is a reusable software component
that can be manipulated visually in a builder tool."
ƒ
Softwarekomponente
•
ƒ
ƒ
ƒ
Wiederverwendbare, in sich abgeschlossene Einheit
Interaktive Manipulation in Entwicklungswerkzeug (GUI-Builder)
•
Visuelle Programmierung
•
Sichtbare und unsichtbare Beans
•
Zusammenstellung zu komplexeren Beans, Applets oder Anwendungen
•
Serialisierung oder Erzeugung von Programmcode
Definiert durch Java-Klasse, die bestimmten Konventionen folgt
•
Klassendefinition und Methodensignaturen
•
Ereignismechanismus
Hilfsklassen im Paket java.beans
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
2
Grundlegende Eigenschaften von Beans
ƒ
wird durch ein Objekt repräsentiert; existiert sowohl zur Design-Zeit als auch
zur Laufzeit
ƒ
ist durch eine Klasse definiert
ƒ
besitzt konfigurierbare Eigenschaften, durch welche das Bean angepasst
werden kann
ƒ
verwendet Ereigniskonzept zur Interaktion mit anderen Programmteilen
ƒ
die Programmierung muss bestimmten Konventionen („Design Patterns“)
folgen:
•
Klasse hat parameterlosen Konstruktor
•
Zugriff auf Eigenschaften mittels Getter- und Setter-Methoden
•
Design-Pattern für die Kodierung von Ereignissen
•
Namenskonventionen für Eigenschaften und Ereignisse
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
3
Grundlegende Eigenschaften von Beans (Fortsetzung)
ƒ
ist serialisierbar und deserialisierbar
ƒ
erlaubt Introspection, d.h. die Ausforschung und Beschreibung der
Eigenschaften, Methoden und Ereignisse
ƒ
•
Introspection auf Basis der Design-Patterns und Namenskonventionen
•
Beschreibung durch eigene Informationsklasse (= BeanInfo-Klasse)
erlaubt die interaktive Anpassung in interaktiven Entwicklungswerkzeugen
•
auf Basis der Beschreibung des Beans
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
4
Verwendung von Beans
ƒ
bei wiederverwendbaren, durch Eigenschaften anpassbaren Komponenten
ƒ
insbesondere für die interaktive, visuelle Programmierung
ƒ
sowohl für kleine Komponenten als auch für große Anwendungen, z.B.:
•
Button
•
Timer
•
ImageViewer
•
Spreadsheet
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
5
Beispiel CountdownBean
ƒ
CountdownBean ist eine wiederverwendbare Komponente für Countdowns
ƒ
CountdownBean leistet folgendes:
•
man kann eine Countdown-Zeit setzen (Zeit im Millisekunden)
•
man kann Countdown starten
•
man kann Countdown stoppen
•
Bean informiert in bestimmten Zeitintervallen über die Restzeit
- zuerst in größeren Abständen
- zum Ende hin in kürzeren Abständen
•
Bean informiert über Starten, Stoppen und Ende des Countdown
•
Bean ist anpassbar durch
- Intervallzeiten
- Zeitspanne, wenn kurze Intervallzeiten beginnen sollen
ƒ
Beispielanwendung des CountdownBeans:
•
bei Bombe
•
bei Selbstauslöser in Fotoapparaten
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
6
Beispiel CountdownBean: Klassendiagramm
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
7
Bean-Klasse
ƒ
wie jede andere Klasse
ƒ
braucht unbedingt parameterlosen Konstruktor
Beispiel CountdownBean:
public class CountdownBean extends java.lang.Object implements Runnable
{
/** Creates a new instance of CountdownBean */
public CountdownBean() {
...
}
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
8
JavaBeans
Grundlagen
Eigenschaften
Ereignisse
Konfiguration
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
9
Eigenschaften (Properties)
ƒ
Bestimmen Erscheinung und Verhalten
•
ƒ
Können von Entwicklungswerkzeug ausgelesen und verändert werden
Erkennbar an Methodensignatur für Getter- und Setter-Methoden
•
Simple Properties
public <PropType> get<PropertyName>() bzw. public boolean is<PropertyName>()
public void set<PropName>(<PropType> value)
void
int
void
boolean
•
setMaxLength(int maxLength);
getMaxLength();
setEditable(boolean editable);
isEditable();
Indexed Properties
public <PropType>[] get<PropertyName>()
public void set<PropName>(<PropType>[] value)
public <PropType> get<PropertyName>(int i)
public void set<PropName>(int i, <PropType> value)
void
void
float[]
float
setDataSet(float[] dataSet);
setDataSet(int index, float data);
getDataSet();
getDataSet(int index);
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
10
Beispiel CountdownBean: Eigenschaften
Eigenschaften für
• Countdown-Zeit
• langes Intervall
public int getTime() {
return time;
}
public void setTime(int time) {
this.time = time;
}
public void setLongInterval(int i) {
longInterval = i;
}
public int getLongInterval() {
return longInterval;
}
• kurzes Intervall
public void setShortInterval(int i) {
shortInterval = i;
}
public int getShortInterval() {
return shortInterval;
}
• Beginn des kurzen Intervalls
public void setShortIntervalPeriod(int i) {
shortIntervalPeriod = i;
}
public int getShortIntervalPeriod() {
return shortIntervalPeriod;
}
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
11
JavaBeans
Grundlagen
Eigenschaften
Ereignisse
Konfiguration
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
12
Ereignisse
ƒ
ƒ
ƒ
ƒ
Kommunikation mit anderen Beans
•
Zustandsänderung wird allen Interessierten mitgeteilt
•
Lose gekoppelte Kommunikation
Quelle
•
Auslöser eines Ereignisses
•
Benachrichtigt Interessierte
Interessierter (Listener)
•
Reagiert auf Ereignis
•
Wird bei Quelle registriert und deregistriert
Ereignisobjekt (EventObject)
•
Informationen über Ereignis
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
13
Design Pattern für Ereignisse
ƒ
Listener
•
•
Interface welche Ereignismethoden implementiert
kann java.util.EventListener erweitern
public interface TimerListener extends java.util.EventListener {
public void timerAction(TimerEvent e);
}
ƒ
Quelle
•
implementiert Methoden für das Anfügen und Entfernen von Listener
public void add<ListenerType>(<ListenerType> listener)
public void remove<ListenerType>(<ListenerType> listener);
public class TimerBean {
public void addTimerListener(TimerListener l) { … }
public void removeTimerListener(TimerListener l) { … }
private void fireTimerEvent(TimerEvent e) { … }
}
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
14
Design Pattern für Ereignisse (Fortsetzung)
ƒ
Ereignisobjekt
•
•
erweitert java.util.EventObject
kommuniziert Informationen über Ereignis
public class TimerEvent extends java.util.EventObject {
private long time;
public TimerEvent(Object source) {
super(source);
time = System.currentTimeMillis();
}
public long getTime() {
return time;
}
}
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
15
Beispiel CountdownBean: Countdown-Ereignis
ƒ
CountdownListener
public interface CountdownEventListener extends EventListener {
void countdownStarted(CountdownEvent e);
void countdownStopped(CountdownEvent e);
void countdownTimeElapsed(CountdownEvent e);
void countdownFinished(CountdownEvent e);
}
ƒ
CountdownEvent
public class CountdownEvent extends java.util.EventObject {
public CountdownEvent(Object source, int restTime) {
super(source);
this.restTime = restTime;
}
public int getRestTime() {
return restTime;
}
private int restTime;
}
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
16
Beispiel CountdownBean: Countdown-Ereignis (Forts.)
ƒ
Quelle
public class CountdownBean extends java.lang.Object implements Runnable {
public void addCountdownEventListener(CountdownEventListener l) {
countDownListenerList.add(CountdownEventListener.class, l);
}
public void removeCountdownEventListener(CountdownEventListener l) {
countDownListenerList.remove(CountdownEventListener.class, l);
}
protected void fireCountdownStartedEvent() {
CountdownEvent event = new CountdownEvent(this, restTime);
CountdownEventListener[] cdLs =
((CountdownEventListener[])lList.getListeners(CountdownEventListener.class));
for (int i = 0; i < cdLs.length; i++) {
cdLs[i].countdownStarted(event);
}
}
protected void fireCountdownTimeElapsedEvent() {
CountdownEvent event = new CountdownEvent(this, restTime);
CountdownEventListener[] cdLList =
((CountdownEventListener[]) lList.getListeners(CountdownEventListener.class));
for (int i = 0; i < cdLs.length; i++) {
cdLs[i].countdownTimeElapsed(event);
}
}
...
JOHANNES KEPLER
UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
17
Bound Properties
ƒ Ereigniskonzept für die Benachrichtigung von Wertänderungen bei Properties
ƒ Listener PropertyChangeListener
public interface PropertyChangeListener extends EventListener {
void propertyChange(PropertyChangeEvent evt);
}
ƒ Ereignisobjekt PropertyChangeEvent enthält alten und neuen Wert
public class PropertyChangeEvent extends java.util.EventObject {
public PropertyChangeEvent(Object source, String propertyName,
Object oldValue, Object newValue) { ... }
public String getPropertyName() { return propertyName; }
public Object getNewValue() { return newValue; }
public Object getOldValue() { return oldValue; }
...
ƒ Anmeldung und Abmeldung über addPropertyChangeListener und removePropertyChangeListener; Implementierung mittels PropertyChangeSupport
transient protected PropertyChangeSupport pchglisteners;
public void addPropertyChangeListener(PropertyChangeListener l) {
pchglisteners.addPropertyChangeListener(l);
}
public void removePropertyChangeListener(PropertyChangeListener l) {
pchglisteners.removePropertyChangeListener(l);
}
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
18
Beispiel CountdownBean: PropertyChange-Ereignis
ƒ
PropertyChange-Ereignis bei Änderung der Countdown-Zeit
public void setTime(int time) {
int oldValue = this.time;
this.time = time;
pchglisteners.firePropertyChange("time", oldValue, this.time);
}
public void addTimeChangeListener(PropertyChangeListener listener) {
pchglisteners.addPropertyChangeListener(listener);
}
public void removeTimeChangeListener(PropertyChangeListener listener) {
pchglisteners.removePropertyChangeListener(listener);
}
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
19
Constrained Properties
ƒ Erlaubt anderen Objekten, Wertänderung bei Property zu verhindern
ƒ Listener VetoableChangeListener: Methode vetoableChange wirft
PropertyVetoException
public interface VetoableChangeListener extends EventListener {
void vetoableChange(PropertyChangeEvent evt)
throws PropertyVetoException;
}
ƒ Anmeldung und Abmelden von Listeners; Implementierung über
VetoableChangeSupport
transient protected VetoableChangeSupport vchglistener
= new VetoableChangeSupport(this);
public void addVetoableChangeListener(VetoableChangeListener l) {
vchglisteners.addVetoableChangeListener(l); }
public void removeVetoableChangeListener(VetoableChangeListener l) {
vchglisteners.removeVetoableChangeListener(l); }
ƒ Setter-Methode soll PropertyVetoException werfen
public void setValue(int value) throws PropertyVetoException {
int oldValue = this.value;
vchglisteners.fireVetoableChange("value", oldValue , value);
this.value = value;
pchglisteners.firePropertyChange("value", oldvalue, on);
}
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
20
Beispiel CountdownBean: VetoableChange-Ereignis
ƒ
VetoableChange-Ereignis bei Setzen von langem und kurzem Intervall und Periode
ƒ
erlaubt Einspruch, wenn Werte nicht akzeptabel, z.B. wenn sie nicht zusammenpassen
transient protected VetoableChangeSupport vchglisteners =
new VetoableChangeSupport(this);
...
public int getLongInterval() {
return longInterval;
}
public void addVetoableChangeListener(VetoableChangeListener l) {
vchglisteners.addVetoableChangeListener(l);
}
public void removeVetoableChangeListener(VetoableChangeListener l) {
vchglisteners.removeVetoableChangeListener(l);
}
public void setLongInterval(int interval) throws PropertyVetoException {
vchglisteners.fireVetoableChange("longInterval", this.longInterval, interval);
longInterval = interval;
}
public void setShortInterval(int interval) throws PropertyVetoException {
vchglisteners.fireVetoableChange("shortInterval", this.shortInterval, interval);
this.shortInterval = interval;
}
...
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
21
Beispiel CountdownBean: start und run-Methoden
public void start() {
restTime = getTime() * 1000;
countdownThread = new Thread(this);
countdownThread.start();
}
public void run() {
fireCountdownStartedEvent();
try {
while (restTime > 0) {
int timeToNextEvent;
if (restTime <= getShortIntervalPeriod()) {
timeToNextEvent = getShortInterval();
} else {
timeToNextEvent = getLongInterval();
}
if (timeToNextEvent > restTime) {
timeToNextEvent = restTime;
}
Thread.sleep(timeToNextEvent);
restTime = restTime - timeToNextEvent;
fireCountdownTimeElapsedEvent();
}
fireCountdownFinishedEvent();
} catch (InterruptedException ign) { }
}
...
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
22
JavaBeans
Grundlagen
Eigenschaften
Ereignisse
Konfiguration
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
23
Introspection
ƒ
Introspector: versorgt Entwicklungsumgebung mit Informationen über Bean
Î Analysiert Bean und eruiert Eigenschaften, Ereignisse und Methoden
Î verwendet Reflection
Î orientiert sich an den Programmierkonventionen
Î erstellt daraus BeanInfo-Klasse
ƒ
BeanInfo-Klasse kann auch programmiert werden
ƒ
BeanInfo-Klasse
•
Klassenname = Name der Bean + "BeanInfo"
•
Implementiert Interface BeanInfo
•
Hilfsklasse SimpleBeanInfo mit leeren Methoden
public interface BeanInfo {
BeanInfo[]
getAdditionalBeanInfo();
BeanDescriptor
getBeanDescriptor();
int
getDefaultEventIndex();
int
getDefaultPropertyIndex();
EventSetDescriptor[] getEventSetDescriptors();
Image
getIcon(int iconKind);
MethodDescriptor[]
getMethodDescriptors();
PropertyDescriptor[] getPropertyDescriptors();
}
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
24
Konfiguration von Beans
ƒ
Benutzerdefinierter Editor
•
Konfiguration einer Eigenschaft oder aller Eigenschaften einer Klasse
•
Muss Interface PropertyEditor implementieren
•
Hilfsklasse PropertyEditorSupport
•
Zuordnung über Namenskonvention, PropertyEditorManager, BeanInfo
Background
ƒ
blue
Benutzerdefinierte Konfigurationsoberfläche
•
Konfiguration einer gesamten Bean
•
Muss Customizer implementieren und sollte Container erweitern
•
Anzeige in Dialogfenster oder Panel
•
Zuordnung zu Bean über BeanInfo
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
25
PropertyEditor (1)
ƒ
Wird von GUI-Builder für das Setzen einer Eigenschaft verwendet
public interface PropertyEditor {
void setValue(Object value);
Setzen des Wertes beim Bean
Object getValue();
Lesen des Wertes vom Bean
boolean isPaintable();
Gibt an, ob Wert gezeichnet werden soll
void paintValue(java.awt.Graphics gfx,
java.awt.Rectangle box);
Zeichnet Wert im Property-Editor
java.awt.Component getCustomEditor();
Liefert Component zum Editieren der Property
boolean supportsCustomEditor();
True, wenn es Custom-Editor gibt
String getJavaInitializationString();
String der Source-Code zum Setzen darstellt
String getAsText();
Textrepräsentation des Wertes
void setAsText(String text)
throws IllegalArgumentException;
Erzeugt aus Eingabetext den Wert der Property
String[] getTags();
Liefert ein Array von Strings für Combobox im
Property-Editor
...
}
ƒ
PropertyEditorSupport ist eine leere Basisimplementierung
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
26
PropertyEditor (2)
ƒ
unterstützt 3 Arten des Setzens:
(1) als Text: muss folgende Methoden implementieren
• String getAsText()
• void setAsText(String text)
(2) Auswahl aus einer Aufzählung: muss folgende Methoden implementieren
• String[] getTags()
• String getAsText()
• void setAsText(String text)
(3) über einen eigenen Dialog:
• boolean isPaintable() - liefert true
• void paintValue(Graphics gfx, Rectangle box)
• boolean supportsCustomEditor() - liefert true
• public Component getCustomEditor()
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
27
Beispiel PropertyEditor: BlinkShape bei Blinker
ƒ
JavaBean Blinker ermöglicht Blinken in 3 unterschiedlichen Formen
•
Property blinkShape
•
Konstante für die 3 Shapes
public class Blinker extends javax.swing.JComponent implements Serializable
{
public static final int RECT_SHAPE = 1;
public static final int OVAL_SHAPE = 2;
public static final int TRIANGLE_SHAPE = 3;
…
int blinkShape = RECT_SHAPE;
public int getBlinkShape() {
return blinkShape;
}
public void setBlinkShape(int blinkShape) {
this.blinkShape = blinkShape;
}
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
28
Beispiel PropertyEditor: BlinkShape bei Blinker
ƒ
Setzen der Eigenschaft über PropertyEditor BlinkShapEditor
public class BlinkShapeEditor extends PropertyEditorSupport {
int[] options = new int[] { 1, 2, 3 };
String[] tags = new String[] { "rectangular", "oval", "triangular" };
•
Erzeugen der String-Repräsentation aus Wert
public String getAsText() {
int val = ((Integer)getValue()).intValue();
try {
return tags[val-1];
} catch (ArrayIndexOutOfBoundsException e) {
return "";
}
}
•
Erzeugen des Wertes aus Text
public void setAsText(String s) throws IllegalArgumentException {
for (int i = 0; i < tags.length; i++) {
if (s.equals(tags[i])) {
setValue(new Integer(options[i]));
return;
}
}
}
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
29
Beispiel PropertyEditor: BlinkShape bei Blinker (2)
•
Code-Fragment für das Setzen der Property bei Erzeugung von Code durch GUIBuilder
public String getJavaInitializationString() {
int val = ((Integer)getValue()).intValue();
if (val == 1) return "Blinker.RECT_SHAPE";
if (val == 2) return "Blinker.OVAL_SHAPE";
if (val == 3) return "Blinker.TRIANGLE_SHAPE";
return "0";
}
}
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
30
Beispiel Blinker: Setzen der Eigenschaft blinkShape
Erzeugter Code
Auswahl im Editor
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
31
BeanInfo
ƒ
ƒ
Über BeanInfo-Klasse kann die Konfiguration einer JavaBean gestaltet
werden
•
welche Properties und Events sind sichtbar
•
welche PropertyEditors werden verwendet
•
welches Icon wird verwendet
•
…
Interface BeanInfo (Basisimplementierung SimpleBeanInfo)
public interface BeanInfo {
BeanDescriptor getBeanDescriptor();
allgemeine Beschreibung des Bean
EventSetDescriptor[] getEventSetDescriptors(); Beschreibung der Events
PropertyDescriptor[] getPropertyDescriptors(); Beschreibung der Properties
MethodDescriptor[] getMethodDescriptors();
Beschreibung der Methoden
BeanInfo[] getAdditionalBeanInfo();
Zusätzliche BeanInfo-Klassen, die
verwendet werden (z.B. Superklasse)
java.awt.Image getIcon(int iconKind);
Icon für Bean
…
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
32
Beispiel BeanInfo: BeanInfo für Blinker
public class BlinkerBeanInfo extends SimpleBeanInfo {
public PropertyDescriptor[] getPropertyDescriptors() {
try {
PropertyDescriptor blinkShapeDescr
= new PropertyDescriptor("blinkShape", Blinker.class);
blinkShapeDescr.setPropertyEditorClass(BlinkShapeEditor.class);
return new PropertyDescriptor[] {blinkShapeDescr };
} catch (IntrospectionException e) {
return null;
Setzen des PropertyEditors
}
bei Property blinkShape
}
public BeanInfo[] getAdditionalBeanInfo() {
Class superclass = beanClass.getSuperclass();
try {
BeanInfo superBeanInfo = Introspector.getBeanInfo(superclass);
return new BeanInfo[] { superBeanInfo };
}
catch (IntrospectionException ex) {
ex.printStackTrace();
BeanInfo der Superklasse
return null;
übernehmen
}
}
}
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
33
Beispiel CountdownBean: Anpassung mit Visual Editor
ƒ
Visual Editor (http://www.eclipse.org/vep/) ist ein Eclipse Tool für die visuelle
interaktive Erstellung von GUIs
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
34
Beispiel CountdownBean: Anpassung in netBeans IDE
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
35
Verpacken von Beans
ƒ
JavaBean besteht aus mehreren Dateien
•
ƒ
Auslieferung als JAR-Datei
•
ƒ
z.B. Java-Klassen, Dokumentation, Bilder, Videos, …
JAR-Werkzeug wird mit JDK mitgeliefert
META-INF\MANIFEST.MF
•
Beschreibt Inhalt der JAR-Datei
Manifest-Version: 1.0
Name: sunw/demo/juggler/Juggler.class
Java-Bean: True
Created-By: 1.2.2 (Sun Microsystems Inc.)
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
36
Zusammenfassung
ƒ
Komponentenmodell von Java
•
ƒ
ƒ
Wiederverwendung
Merkmale einer JavaBean
•
Eigenschaften
•
Ereignisse
Manipulation in Entwicklungswerkzeug
•
Rapid Application Development
•
Introspection
•
PropertyEditors und Customizers
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
37
Literatur
ƒ
Java Beans Homepage: http://java.sun.com/products/javabeans/
ƒ
JavaBeans 1.01 API Specification, Sun Microsystems, 1997,
http://java.sun.com/products/javabeans/docs/spec.html
ƒ
Introduction to the JavaBeans API, Tutorials & Code Camps,
http://java.sun.com/developer/onlineTraining/Beans/JBeansAPI/index.html
ƒ
JavaBeans 101 Tutorial, Tutorials & Code Camps,
http://java.sun.com/developer/onlineTraining/Beans/bean01/index.html,
http://java.sun.com/developer/onlineTraining/Beans/beans02/index.html
ƒ
Horstmann, Cornell, Core Java 2, Band 2 - Expertenwissen, Markt und Technik, 2002:
Kapitel 8
ƒ
Krüger, Handbuch der Java-Programmierung, 3. Auflage, Addison-Wesley, 2003,
http://www.javabuch.de, Kapitel 44
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
38
Herunterladen