summaryrefslogtreecommitdiffstats
path: root/Master/Reference Architectures and Patterns/hjp5/html/k100189.html
blob: bc4c0af9a70d557e12bdd2010bc0513a512b7a27 (plain)
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
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
<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,k100184.html;106,k100188.html;107,k100190.html;108,k100192.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">&nbsp;Titel&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100003.html">&nbsp;Inhalt&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="search.html">&nbsp;Suchen&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="index.html">&nbsp;Index&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="../jdkdocs/index.html" onClick="this.href=getDocIndex()">&nbsp;DOC&nbsp;</a>
<td align="right">Handbuch der Java-Programmierung, 5. Auflage
<tr bgcolor="#EEFFCC">
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100184.html">&nbsp;&lt;&lt;&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100188.html">&nbsp;&nbsp;&lt;&nbsp;&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100190.html">&nbsp;&nbsp;&gt;&nbsp;&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100192.html">&nbsp;&gt;&gt;&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="../jdkdocs/api/index.html" onClick="this.href=getApiIndex()">&nbsp;API&nbsp;</a>
<td align="right">Kapitel 29 - Low-Level-Events
</table>
<hr>


<!-- Section -->
<a name="sectlevel2id029005"></a>
<h2>29.5 <a name="ixa101975">Focus-Events</a></h2>
<hr>
<ul>
<li><a href="k100189.html#sectlevel2id029005">29.5 Focus-Events</a>
</ul>
<hr>

<p>
Der <i>Fokus</i> zeigt an, welches Fenster die Tastatureingaben erh&auml;lt.
Sind mehrere Fenster gleichzeitig ge&ouml;ffnet, so kann immer nur
eines von ihnen den Fokus beanspruchen. Sind auf einem aktiven Fenster
mehrere Dialogelemente aktiv, so kann ebenfalls nur eines davon den
Fokus erhalten, denn jedes Dialogelement wird ebenfalls durch ein
(meist unsichtbares) Fenster dargestellt. 

<p>
Ein Empf&auml;nger f&uuml;r Focus-Events muss das Interface <a href="index_f.html#ixb101432"><font color=#000080><tt>FocusListener</tt></font></a>
implementieren und bekommt Events des Typs <a href="index_f.html#ixb101431"><font color=#000080><tt>FocusEvent</tt></font></a>
&uuml;bergeben. <a href="index_f.html#ixb101431"><font color=#000080><tt>FocusEvent</tt></font></a>
erweitert die Klasse <a href="index_c.html#ixb101403"><font color=#000080><tt>ComponentEvent</tt></font></a>
und stellt neben <a href="index_g.html#ixb101409"><font color=#000080><tt>getID</tt></font></a>
und <a href="index_g.html#ixb101401"><font color=#000080><tt>getSource</tt></font></a>
die Methode <a name="ixa101976"><a href="index_i.html#ixb101521"><font color=#000080><tt>isTemporary</tt></font></a></a>
zur Verf&uuml;gung, die anzeigt, ob der Fokuswechsel tempor&auml;r
oder permanent ist: 
<p>
<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#EEFFCC">
<tr>
<td valign=top width=100%>
<font color="#660066">
<pre>
public boolean isTemporary()
</pre>
</font>
</td>
<td valign=top>
<a href="../jdkdocs/api/java/awt/event/FocusEvent.html" onClick="this.href=getApiDoc('java.awt.event.FocusEvent')"><font color="#660066" size=-1>java.awt.event.FocusEvent</font></a></td>
</tr>
</table>

<p>
Die Registrierung von Focus-Events erfolgt mit der Methode <a name="ixa101977"><a href="index_a.html#ixb101433"><font color=#000080><tt>addFocusListener</tt></font></a></a>,
die auf allen Objekten des Typs <a href="index_c.html#ixb101302"><font color=#000080><tt>Component</tt></font></a>
oder daraus abgeleiteten Objekten zur Verf&uuml;gung steht: 
<p>
<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#EEFFCC">
<tr>
<td valign=top width=100%>
<font color="#660066">
<pre>
public void addFocusListener(FocusListener l)
</pre>
</font>
</td>
<td valign=top>
<a href="../jdkdocs/api/java/awt/Component.html" onClick="this.href=getApiDoc('java.awt.Component')"><font color="#660066" size=-1>java.awt.Component</font></a></td>
</tr>
</table>

<p>
Das Interface <a href="index_f.html#ixb101432"><font color=#000080><tt>FocusListener</tt></font></a>
enth&auml;lt lediglich zwei unterschiedliche Methoden: 
<p>
<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#EEFFCC">
<tr>
<td valign=top width=100%>
<font color="#660066">
<pre>
public abstract void focusGained(FocusEvent e)

public abstract void focusLost(FocusEvent e)
</pre>
</font>
</td>
<td valign=top>
<a href="../jdkdocs/api/java/awt/event/FocusListener.html" onClick="this.href=getApiDoc('java.awt.event.FocusListener')"><font color="#660066" size=-1>java.awt.event.FocusListener</font></a></td>
</tr>
</table>

<p>
<a name="ixa101978"><a href="index_f.html#ixb101434"><font color=#000080><tt>focusGained</tt></font></a></a>
wird aufgerufen, wenn die Komponente den Fokus erh&auml;lt, und <a name="ixa101979"><a href="index_f.html#ixb101435"><font color=#000080><tt>focusLost</tt></font></a></a>,
wenn sie ihn wieder abgibt. Eine Komponente erh&auml;lt den Fokus
beispielsweise, wenn sie mit der Maus angeklickt oder (unter Windows)
mit Hilfe der Tasten <font color="#007700"><tt>[TAB]</tt></font> oder
<font color="#007700"><tt>[UMSCHALT]</tt></font>+<font color="#007700"><tt>[TAB]</tt></font>
oder &uuml;ber einen Beschleuniger angesprungen wurde. Au&szlig;erdem
gibt es die M&ouml;glichkeit, den Fokus programmgesteuert zu ver&auml;ndern.
Dazu gibt es die Methode <a name="ixa101980"><a href="index_r.html#ixb101522"><font color=#000080><tt>requestFocus</tt></font></a></a>
der Klasse <a href="index_c.html#ixb101302"><font color=#000080><tt>Component</tt></font></a>,
mit der eine Komponente den Fokus f&uuml;r sich selbst beanspruchen
bzw. ihn einer anderen Komponente zuweisen kann: 
<p>
<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#EEFFCC">
<tr>
<td valign=top width=100%>
<font color="#660066">
<pre>
public void requestFocus()
</pre>
</font>
</td>
<td valign=top>
<a href="../jdkdocs/api/java/awt/Component.html" onClick="this.href=getApiDoc('java.awt.Component')"><font color="#660066" size=-1>java.awt.Component</font></a></td>
</tr>
</table>
<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>
Der explizite Umgang mit Focus-Events ist etwa bei Dialogelementen
sinnvoll. Dadurch kann ein Edit-Control beispielsweise feststellen,
dass das n&auml;chste Dialogelement angesprungen werden soll und ein
eventuell ge&auml;nderter Text zuvor gespeichert werden muss. Focus-Events
sind oft schwierig zu debuggen, denn durch den Wechsel zwischen Debug-Window
und Anwendung werden meist zus&auml;tzliche Fokuswechsel ausgel&ouml;st,
die den Fehler verschleiern oder die Fehlerstelle unerreichbar machen.
Wird innerhalb von Fokus-Handlern die Methode <a href="index_r.html#ixb101522"><font color=#000080><tt>requestFocus</tt></font></a>
aufgerufen, kann es zudem leicht zu Endlosschleifen kommen.</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">&nbsp;Hinweis&nbsp;</font></td>
</tr>
</table>
</td>
<td width=1 align=left valign=top bgcolor="#000077"><img src="trp1_1.gif"></td>
</tr>
</table>

<p>
Das folgende Programm zeigt die Anwendung eines <a href="index_f.html#ixb101432"><font color=#000080><tt>FocusListener</tt></font></a>-Interfaces
zur Implementierung der Methoden <a href="index_f.html#ixb101434"><font color=#000080><tt>focusGained</tt></font></a>
und <a href="index_f.html#ixb101435"><font color=#000080><tt>focusLost</tt></font></a>
auf einem <a href="index_f.html#ixb101144"><font color=#000080><tt>Frame</tt></font></a>-Objekt.
Wenn das Fenster den Eingabefokus erh&auml;lt, wird der Hintergrund
gelb und gibt die Meldung &#187;Fokus erhalten&#171; aus. Verliert
das Fenster den Fokus, so wird der Hintergrund grau und die Meldung
&#187;Kein Fokus&#171; wird angezeigt. Die Registrierung des Fokusempf&auml;nger-Objekts
erfolgt durch Aufruf von <a href="index_a.html#ixb101433"><font color=#000080><tt>addFocusListener(this)</tt></font></a>,
bei dem das Fensterobjekt sich selbst als Empf&auml;nger registriert:
<a name="fokusereignisse"></a>

<p>
<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#DDDDDD">
<tr>
<td valign=top>
<font color="#000055">
<pre>
<font color="#555555">001 </font><font color="#00AA00">/* Listing2905.java */</font>
<font color="#555555">002 </font>
<font color="#555555">003 </font><font color="#0000AA">import</font> java.awt.*;
<font color="#555555">004 </font><font color="#0000AA">import</font> java.awt.event.*;
<font color="#555555">005 </font>
<font color="#555555">006 </font><font color="#0000AA">public</font> <font color="#0000AA">class</font> Listing2905
<font color="#555555">007 </font><font color="#0000AA">extends</font> Frame
<font color="#555555">008 </font><font color="#0000AA">implements</font> FocusListener
<font color="#555555">009 </font>{
<font color="#555555">010 </font>  <font color="#006699">boolean</font> havefocus = <font color="#006699">false</font>;
<font color="#555555">011 </font>
<font color="#555555">012 </font>  <font color="#0000AA">public</font> <font color="#0000AA">static</font> <font color="#006699">void</font> main(String[] args)
<font color="#555555">013 </font>  {
<font color="#555555">014 </font>    Listing2905 wnd = <font color="#0000AA">new</font> Listing2905();
<font color="#555555">015 </font>  }
<font color="#555555">016 </font>
<font color="#555555">017 </font>  <font color="#0000AA">public</font> Listing2905()
<font color="#555555">018 </font>  {
<font color="#555555">019 </font>    <font color="#006699">super</font>(<font color="#0000FF">"Focus-Listener"</font>);
<font color="#555555">020 </font>    addFocusListener(<font color="#006699">this</font>);
<font color="#555555">021 </font>    addWindowListener(<font color="#0000AA">new</font> WindowClosingAdapter(<font color="#006699">true</font>));
<font color="#555555">022 </font>    setBackground(Color.lightGray);
<font color="#555555">023 </font>    setSize(300,200);
<font color="#555555">024 </font>    setLocation(200,100);
<font color="#555555">025 </font>    setVisible(<font color="#006699">true</font>);
<font color="#555555">026 </font>  }
<font color="#555555">027 </font>
<font color="#555555">028 </font>  <font color="#0000AA">public</font> <font color="#006699">void</font> paint(Graphics g)
<font color="#555555">029 </font>  {
<font color="#555555">030 </font>    <font color="#0000AA">if</font> (havefocus) {
<font color="#555555">031 </font>      g.setColor(Color.black);
<font color="#555555">032 </font>      g.drawString(<font color="#0000FF">"Fokus erhalten"</font>,10,50);
<font color="#555555">033 </font>    } <font color="#0000AA">else</font> {
<font color="#555555">034 </font>      g.setColor(Color.darkGray);
<font color="#555555">035 </font>      g.drawString(<font color="#0000FF">"Kein Fokus"</font>,10,50);
<font color="#555555">036 </font>    }
<font color="#555555">037 </font>  }
<font color="#555555">038 </font>
<font color="#555555">039 </font>  <font color="#0000AA">public</font> <font color="#006699">void</font> focusGained(FocusEvent event)
<font color="#555555">040 </font>  {
<font color="#555555">041 </font>    havefocus = <font color="#006699">true</font>;
<font color="#555555">042 </font>    setBackground(Color.yellow);
<font color="#555555">043 </font>    repaint();
<font color="#555555">044 </font>  }
<font color="#555555">045 </font>
<font color="#555555">046 </font>  <font color="#0000AA">public</font> <font color="#006699">void</font> focusLost(FocusEvent event)
<font color="#555555">047 </font>  {
<font color="#555555">048 </font>    havefocus = <font color="#006699">false</font>;
<font color="#555555">049 </font>    setBackground(Color.lightGray);
<font color="#555555">050 </font>    repaint();
<font color="#555555">051 </font>  }
<font color="#555555">052 </font>}</pre>
</font>
</td>
<td valign=top align=right>
<a href="../examples/Listing2905.java"><font color="#000055" size=-1>Listing2905.java</font></a></td>
</tr>
</table>
<i>
Listing 29.5: Behandlung von Fokus-Ereignissen</i></p>
<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>
Das Programm verwendet zwei unterschiedliche Techniken, um Ereignisempf&auml;nger
zu registrieren. F&uuml;r die Focus-Events implementiert es das <a href="index_f.html#ixb101432"><font color=#000080><tt>FocusListener</tt></font></a>-Interface
und registriert sich bei sich selbst. Dies ist eine vern&uuml;nftige
Vorgehensweise, da s&auml;mtliche Methoden des Interfaces ben&ouml;tigt
werden. Das <a href="index_w.html#ixb101156"><font color=#000080><tt>windowClosing</tt></font></a>-Event
wird dagegen von der in <a href="k100152.html#fensterschliessen">Abschnitt 23.2.4</a>
vorgestellten <a href="index_w.html#ixb100159"><font color=#000080><tt>WindowClosingAdapter</tt></font></a>
zur Verf&uuml;gung gestellt, die sich aus <a href="index_w.html#ixb101429"><font color=#000080><tt>WindowAdapter</tt></font></a>
ableitet und die Methode <a href="index_w.html#ixb101156"><font color=#000080><tt>windowClosing</tt></font></a>
mit der Funktionalit&auml;t zum Schlie&szlig;en des Fensters und zum
Beenden des Programms belegt. Diese Technik demonstriert beispielhaft
die Entwicklung spezialisierter Adapterklassen, die mehrfach verwendet
werden k&ouml;nnen.</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">&nbsp;Hinweis&nbsp;</font></td>
</tr>
</table>
</td>
<td width=1 align=left valign=top bgcolor="#000077"><img src="trp1_1.gif"></td>
</tr>
</table>

<p>
Die Ausgabe des Programms (nachdem es den Fokus erhalten hat) ist:
<p>
<a name="imageid029004"></a>
<img src="images/Fokus.gif">
<p>

<p><i>
Abbildung 29.4: Programm nach Erhalt des Eingabefokus</i></p>
<hr>
<table border=0 cellpadding=0 cellspacing=1 width="100%">
<tr bgcolor="#EEFFCC">
<td width="7%" align=center bgcolor="#DDCC99"><a href="cover.html">&nbsp;Titel&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100003.html">&nbsp;Inhalt&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="search.html">&nbsp;Suchen&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="index.html">&nbsp;Index&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="../jdkdocs/index.html" onClick="this.href=getDocIndex()">&nbsp;DOC&nbsp;</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="k100184.html">&nbsp;&lt;&lt;&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100188.html">&nbsp;&nbsp;&lt;&nbsp;&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100190.html">&nbsp;&nbsp;&gt;&nbsp;&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100192.html">&nbsp;&gt;&gt;&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="../jdkdocs/api/index.html" onClick="this.href=getApiIndex()">&nbsp;API&nbsp;</a>
<td align="right">&copy; 1998, 2007 Guido Kr&uuml;ger &amp; Thomas
Stark, <a href="http://www.javabuch.de">http://www.javabuch.de</a>
</table>
<a name="endofbody"></a>
</body>
</html>