1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
|
<html>
<head>
<title>
Handbuch der Java-Programmierung, 5. Auflage
</title>
</head>
<body>
<a name="startofbody"></a>
<script language="JavaScript" src="hjp4lib.js">
</script>
<script language="JavaScript">
installKbdHandler("97,#startofbody;101,#endofbody;116,cover.html;122,k100003.html;115,search.html;105,index.html;100,JDKDOCS;112,APIDOCS;104,k100279.html;106,k100279.html;107,k100281.html;108,k100287.html");
</script>
<table border=0 cellpadding=0 cellspacing=1 width="100%">
<tr bgcolor="#EEFFCC">
<td width="7%" align=center bgcolor="#DDCC99"><a href="cover.html"> Titel </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100003.html"> Inhalt </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="search.html"> Suchen </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="index.html"> Index </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="../jdkdocs/index.html" onClick="this.href=getDocIndex()"> DOC </a>
<td align="right">Handbuch der Java-Programmierung, 5. Auflage
<tr bgcolor="#EEFFCC">
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100279.html"> << </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100279.html"> < </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100281.html"> > </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100287.html"> >> </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="../jdkdocs/api/index.html" onClick="this.href=getApiIndex()"> API </a>
<td align="right">Kapitel 44 - Beans
</table>
<hr>
<!-- Section -->
<a name="sectionbeans"></a>
<h2>44.1 Grundlagen und Begriffe </h2>
<hr>
<ul>
<li><a href="k100280.html#sectionbeans">44.1 Grundlagen und Begriffe</a>
</ul>
<hr>
<p>
Als <a name="ixa103261"><i>Beans</i></a> werden in Java eigenständige,
wiederverwendbare Softwarekomponenten zum Aufbau von Applets und Applikationen
bezeichnet. Obwohl sie nicht zwangsläufig eine für den Anwender
sichtbare Oberfläche haben müssen, werden Beans doch typischerweise
als grafische Komponenten zur Verfügung gestellt und können
mit Hilfe eines GUI-Editors (GUI = <a name="ixa103262"><i>Graphical User Interface</i></a>)
interaktiv zu komplexen Anwendungen zusammengesetzt werden.
<p>
Derartige GUI-Komponenten gibt es seit geraumer Zeit. Sie wurden auf
dem PC mit Entwicklungsumgebungen wie Visual Basic oder Delphi populär
und haben - beinahe noch stärker als rein sprachengetragene Konzepte
- dazu beigetragen, die komponentenbasierte Softwareentwicklung einer
breiten Masse von Entwicklern nahe zu bringen.
<p>
Beans gibt es seit der Version 1.1 des Java Development Kit. Während
auch vorher schon wiederverwertbare Komponenten entwickelt werden
konnten (wir haben das in <a href="k100219.html#kapitelcanvasundpanel">Kapitel 33</a>
am Beispiel einer selbstentwickelten 7-Segment-Anzeige demonstriert),
wurde mit Einführung der Beans-Architektur eine Standardisierung
vieler wichtiger Konzepte vorgenommen und so die Grundlage für
die einheitliche Entwicklung von GUI-Komponenten gelegt.
<p>
Im Gegensatz zu den betriebssystem- und teilweise herstellerspezifischen
Komponentenmodellen vieler Entwicklungssysteme steht mit den Beans
eine plattformübergreifende Komponentenarchitektur zur Verfügung.
Eine Bean von Hersteller A, die auf Betriebssystem B entwickelt wurde,
sollte (wenn sie nicht aus anderen Gründen plattformabhängig
ist) ohne Probleme in einer Entwicklungsumgebung des Herstellers C
auf Betriebssystem D laufen und Bestandteil eines Java-Programms werden
können, das schließlich auf Plattform E läuft.
<p>
Bevor wir uns den wichtigsten Eigenschaften einer Bean zuwenden, wollen
wir uns kurz mit einigen grundlegenden Begriffen vertraut machen.
<p>
Bei der Entwicklung einer Anwendung mit grafischen Komponenten wird
zweckmäßigerweise zwischen <a name="ixa103263"><i>Designzeitpunkt</i></a>
und <a name="ixa103264"><i>Ausführungszeitpunkt</i></a> unterschieden.
Beide bezeichnen eigentlich Zeiträume und stehen für die
beiden unterschiedlichen Phasen der Entwicklung einer Anwendung und
ihrer späteren Ausführung. Zum Designzeitpunkt werden die
Komponenten in einem grafischen Editor des Entwicklungswerkzeugs ausgewählt,
in einem Formular platziert und an die Erfordernisse der Anwendung
angepasst. Diesen Editor wollen wir fortan als <a name="ixa103265"><i>GUI-Designer</i></a>
bezeichnen, synonym werden aber auch Begriffe wie <i>Grafik-Editor</i>,
<i>GUI-Painter</i> usw. verwendet.
<p>
<table border=0 cellspacing=0 cellpadding=0 width=100%>
<tr>
<td width=1 align=left valign=top bgcolor="#000077"><img src="trp1_1.gif"></td>
<td><img src="trp1_1.gif" width=2></td>
<td valign=top width=1000>
<p>
Ein großer Teil der bei den Beans realisierten Konzepte spielt
nur für den Designzeitraum eine Rolle. Spielt dieser keine Rolle
(beispielsweise weil die Komponenten nicht in einem GUI-Designer,
sondern - wie in diesem Buch bisher stets gezeigt - per Source-Code-Anweisungen
eingebunden und konfiguriert werden), verlieren Beans einiges von
ihrer Nützlichkeit, und herkömmliche Techniken der Wiederverwendung
in objektorientierten Programmen können an ihre Stelle treten.</td>
<td><img src="trp1_1.gif" width=2></td>
<td valign=top>
<table border=0 cellspacing=0 cellpadding=1 width=100% bgcolor="#000077">
<tr>
<td><font color="#FFFFFF"> Hinweis </font></td>
</tr>
</table>
</td>
<td width=1 align=left valign=top bgcolor="#000077"><img src="trp1_1.gif"></td>
</tr>
</table>
<p>
Wir wollen uns die wichtigsten Eigenschaften von Beans zunächst
überblicksartig ansehen:
<ol type=1>
<li>Eine Bean wird im Programm durch ein Objekt (also eine instanzierte
Klasse) repräsentiert. Das gilt sowohl für den Designzeitpunkt,
bei dem es vom GUI-Designer instanziert wird, als auch für den
Ausführungszeitpunkt, bei dem die Anwendung dafür verantwortlich
ist, das Objekt zu konstruieren. Eine Bean benötigt dazu notwendigerweise
einen parameterlosen Konstruktor.
<li>Sie besitzt <i>konfigurierbare Eigenschaften</i>, die ihr Verhalten
festlegen. Diese Eigenschaften werden ausschließlich über
Methodenaufrufe modifiziert, deren Namen und Parameterstrukturen genau
definierten Designkonventionen folgen. Damit können sie vom GUI-Designer
automatisch erkannt und dem Entwickler in einem Editor zur Auswahl
angeboten werden.
<li>Eine Bean ist serialisierbar und deserialisierbar. So können
die zum Designzeitpunkt vom Entwickler vorgenommenen Einstellungen
gespeichert und zum Ausführungszeitpunkt rekonstruiert werden.
(Serialisierung wurde in <a href="k100260.html#kapitelserialisierung">Kapitel 41</a>
behandelt).
<li>Eine Bean sendet Events, um registrierte Listener über Änderungen
ihres internen Zustands oder über sonstige wichtige Ereignisse
zu unterrichten.
<li>Einer Bean kann optional ein Informations-Objekt zugeordnet werden,
mit dessen Hilfe dem GUI-Designer weitere Informationen zur Konfiguration
übergeben und zusätzliche Hilfsmittel, wie spezialisierte
Eigenschafteneditoren oder Konfigurationsassistenten, zur Verfügung
gestellt werden können.
</ol>
<p>
Werden diese Konventionen eingehalten, kann der GUI-Designer die Bean
zum Designzeitpunkt automatisch untersuchen (dieser Vorgang wird als
<a name="ixa103266"><i>Introspection</i></a> bezeichnet) und dem Entwickler
alle öffentlichen Eigenschaften, Methoden und Ereignisse menügesteuert
anbieten. Die Eigenschaften werden dabei üblicherweise in einem
<i>Property Sheet</i> (oder Eigenschaftenfenster) angeboten und erlauben
es dem Entwickler, den Zustand der Bean interaktiv zu verändern.
Da eine Bean serialisierbar ist, kann der GUI-Designer alle Design-Anpassungen
speichern und dem Programm zum Ausführungszeitpunkt zur Verfügung
stellen.
<p>
Bei manchen GUI-Designern können Beans darüber hinaus grafisch
miteinander verbunden werden, um zu symbolisieren, dass bei Auftreten
eines vorgegebenen Ereignisses in Bean A eine bestimmte Methode in
Bean B aufgerufen wird. Der GUI-Designer erzeugt dann eine geeignete
Adapterklasse und generiert den Code zum Aufruf der Methode. Manche
GUI-Designer erlauben es zusätzlich, den generierten Code zu
modifizieren und so bereits wesentliche Teile der Programmlogik im
Designer zu erstellen.
<hr>
<table border=0 cellpadding=0 cellspacing=1 width="100%">
<tr bgcolor="#EEFFCC">
<td width="7%" align=center bgcolor="#DDCC99"><a href="cover.html"> Titel </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100003.html"> Inhalt </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="search.html"> Suchen </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="index.html"> Index </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="../jdkdocs/index.html" onClick="this.href=getDocIndex()"> DOC </a>
<td align="right">Handbuch der Java-Programmierung, 5. Auflage, Addison
Wesley, Version 5.0.1
<tr bgcolor="#EEFFCC">
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100279.html"> << </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100279.html"> < </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100281.html"> > </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100287.html"> >> </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="../jdkdocs/api/index.html" onClick="this.href=getApiIndex()"> API </a>
<td align="right">© 1998, 2007 Guido Krüger & Thomas
Stark, <a href="http://www.javabuch.de">http://www.javabuch.de</a>
</table>
<a name="endofbody"></a>
</body>
</html>
|