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
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
|
<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,k100186.html;107,k100188.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"> 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="k100184.html"> << </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100186.html"> < </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100188.html"> > </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100192.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 29 - Low-Level-Events
</table>
<hr>
<!-- Section -->
<a name="sectlevel2id029003"></a>
<h2>29.3 <a name="ixa101965">Mouse-Events</a></h2>
<hr>
<ul>
<li><a href="k100187.html#sectlevel2id029003">29.3 Mouse-Events</a>
</ul>
<hr>
<p>
Ein Mouse-Event entsteht, wenn der Anwender innerhalb der Client-Area
des Fensters eine der Maustasten drückt oder losläßt.
Dabei reagiert das Programm sowohl auf Klicks der linken als auch
- falls vorhanden - der rechten Maustaste und zeigt an, welche der
Umschalttasten <font color="#007700"><tt>[STRG]</tt></font>, <font color="#007700"><tt>[ALT]</tt></font>,
<font color="#007700"><tt>[UMSCHALT]</tt></font> oder <font color="#007700"><tt>[META]</tt></font>
während des Mausklicks gedrückt waren. Des weiteren ist
es möglich, zwischen einfachen und doppelten Mausklicks zu unterscheiden.
<p>
Ein Empfänger für Mouse-Events muss das Interface <a name="ixa101966"><a href="index_m.html#ixb101416"><font color=#000080><tt>MouseListener</tt></font></a></a>
implementieren und bekommt Events des Typs <a name="ixa101967"><a href="index_m.html#ixb101408"><font color=#000080><tt>MouseEvent</tt></font></a></a>
übergeben. <a href="index_m.html#ixb101408"><font color=#000080><tt>MouseEvent</tt></font></a>
erweitert die Klasse <a href="index_i.html#ixb101414"><font color=#000080><tt>InputEvent</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>
eine Reihe zusätzlicher Methoden zur Verfügung, die wichtige
Informationen liefern. Die Registrierung der Empfängerklasse
erfolgt mit der Methode <a href="index_a.html#ixb101422"><font color=#000080><tt>addMouseListener</tt></font></a>,
die in allen Klassen zur Verfügung steht, die aus <a href="index_c.html#ixb101302"><font color=#000080><tt>Component</tt></font></a>
abgeleitet wurden:
<p>
<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#EEFFCC">
<tr>
<td valign=top width=100%>
<font color="#660066">
<pre>
public void addMouseListener(MouseListener 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>
<a href="k100187.html#methodenmouselistener">Tabelle 29.3</a> gibt
eine Übersicht der Methoden von <a href="index_m.html#ixb101416"><font color=#000080><tt>MouseListener</tt></font></a>
und erklärt ihre Bedeutung: <a name="methodenmouselistener"></a>
<p>
<table cols=2 border width=100%>
<tr>
<td valign=top align=left width=25%><b>Ereignismethode</b></td>
<td valign=top align=left width=75%><b>Bedeutung </b></td></tr>
<tr>
<td valign=top align=left><a href="index_m.html#ixb101420"><font color=#000080><tt>mousePressed</tt></font></a></td>
<td valign=top align=left>Eine Maustaste wurde gedrückt. </td></tr>
<tr>
<td valign=top align=left><a href="index_m.html#ixb101421"><font color=#000080><tt>mouseReleased</tt></font></a></td>
<td valign=top align=left>Die gedrückte Maustaste wurde losgelassen.
</td></tr>
<tr>
<td valign=top align=left><a href="index_m.html#ixb101417"><font color=#000080><tt>mouseClicked</tt></font></a></td>
<td valign=top align=left>Eine Maustaste wurde gedrückt und wieder
losgelassen. Diese Methode wird nach <a href="index_m.html#ixb101421"><font color=#000080><tt>mouseReleased</tt></font></a>
aufgerufen. </td></tr>
<tr>
<td valign=top align=left><a href="index_m.html#ixb101418"><font color=#000080><tt>mouseEntered</tt></font></a></td>
<td valign=top align=left>Der Mauszeiger wurde in den Client-Bereich
der auslösenden Komponente hineinbewegt. </td></tr>
<tr>
<td valign=top align=left><a href="index_m.html#ixb101419"><font color=#000080><tt>mouseExited</tt></font></a></td>
<td valign=top align=left>Der Mauszeiger wurde aus dem Client-Bereich
der auslösenden Komponente herausbewegt. </td></tr>
</table>
<p><i>
Tabelle 29.3: Methoden von MouseListener </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>
Damit ein Programm auf Mausklicks angemessen reagieren kann, benötigt
es zusätzliche Informationen, die es sich mit den Methoden der
Klasse <a href="index_m.html#ixb101408"><font color=#000080><tt>MouseEvent</tt></font></a>
bzw. ihrer Vaterklasse <a href="index_i.html#ixb101414"><font color=#000080><tt>InputEvent</tt></font></a>
beschaffen kann. Zunächst kann mit <a name="ixa101968"><a href="index_g.html#ixb101511"><font color=#000080><tt>getX</tt></font></a></a>,
<a name="ixa101969"><a href="index_g.html#ixb101512"><font color=#000080><tt>getY</tt></font></a></a>
und <a name="ixa101970"><a href="index_g.html#ixb101513"><font color=#000080><tt>getPosition</tt></font></a></a>
die Position des Mauszeigers zum Zeitpunkt des Ereignisses ermittelt
werden:</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>
<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#EEFFCC">
<tr>
<td valign=top width=100%>
<font color="#660066">
<pre>
public int getX()
public int getY()
public Point getPoint()
</pre>
</font>
</td>
<td valign=top>
<a href="../jdkdocs/api/java/awt/event/MouseEvent.html" onClick="this.href=getApiDoc('java.awt.event.MouseEvent')"><font color="#660066" size=-1>java.awt.event.MouseEvent</font></a></td>
</tr>
</table>
<p>
<a href="index_g.html#ixb101511"><font color=#000080><tt>getX</tt></font></a>
liefert die <i>x</i>- und <a href="index_g.html#ixb101512"><font color=#000080><tt>getY</tt></font></a>
die <i>y</i>-Koordinate des Punktes, an dem der Mauszeiger sich beim
Auftreten des Ereignisses befindet. <a href="index_g.html#ixb101411"><font color=#000080><tt>getPoint</tt></font></a>
liefert dieselbe Information zusammengefasst als <a name="ixa101971"><a href="index_p.html#ixb101514"><font color=#000080><tt>Point</tt></font></a></a>-Objekt.
<p>
<table border=0 cellspacing=0 cellpadding=0 width=100%>
<tr>
<td width=1 align=left valign=top bgcolor="#0099CC"><img src="trp1_1.gif"></td>
<td><img src="trp1_1.gif" width=1></td>
<td width=1 align=left valign=top bgcolor="#0099CC"><img src="trp1_1.gif"></td>
<td><img src="trp1_1.gif" width=2></td>
<td valign=top width=1000>
<p>
Die Koordinatenwerte werden relativ zum Ursprung der auslösenden
Komponente angegeben. Bei einem Fenster des Typs <a href="index_f.html#ixb101144"><font color=#000080><tt>Frame</tt></font></a>
bedeutet dies, dass bei einem Klick in der oberen linken Ecke nicht
<font color="#000077"><tt>(0,0)</tt></font> zurückgegeben wird,
sondern <font color="#000077"><tt>(getInsets().left, getInsets().top)</tt></font>.
Dies stimmt mit dem Ursprung des Koordinatensystems überein,
das auch beim Aufruf der Grafikroutinen zugrunde gelegt wird.</td>
<td><img src="trp1_1.gif" width=2></td>
<td valign=top>
<table border=0 cellspacing=0 cellpadding=1 width=100% bgcolor="#0099CC">
<tr>
<td><font color="#FFFFFF"> Tipp </font></td>
</tr>
</table>
</td>
<td width=1 align=left valign=top bgcolor="#0099CC"><img src="trp1_1.gif"></td>
</tr>
</table>
<p>
Des weiteren gibt es in <a href="index_m.html#ixb101408"><font color=#000080><tt>MouseEvent</tt></font></a>
die Methode <a href="index_i.html#ixb101515"><font color=#000080><tt>isPopupTrigger</tt></font></a>,
mit der abgefragt werden kann, ob das Klickereignis den Aufruf eines
Popup-Menüs anzeigen soll. Wir werden darauf in <a href="k100192.html#kapitelmenues">Kapitel 30</a>
zurückkommen.
<p>
Die Methode <a name="ixa101972"><a href="index_g.html#ixb101516"><font color=#000080><tt>getClickCount</tt></font></a></a>
liefert die Anzahl der Mausklicks, die dem aktuellen Ereignis zugeordnet
ist:
<p>
<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#EEFFCC">
<tr>
<td valign=top width=100%>
<font color="#660066">
<pre>
public int getClickCount()
</pre>
</font>
</td>
<td valign=top>
<a href="../jdkdocs/api/java/awt/event/MouseEvent.html" onClick="this.href=getApiDoc('java.awt.event.MouseEvent')"><font color="#660066" size=-1>java.awt.event.MouseEvent</font></a></td>
</tr>
</table>
<p>
Normalerweise hat dieser Zähler den Wert 1, bei Mehrfachklicks
gibt es aber auch <font color="#000077"><tt>MouseEvents</tt></font>
mit dem Wert 2 oder (je nach Schnelligkeit der Klicks) noch höheren
Werten. Die Abfrage von <a href="index_g.html#ixb101516"><font color=#000080><tt>getClickCount</tt></font></a>
kann dazu verwendet werden, auf Doppelklicks zu reagieren. Hierzu
ist lediglich beim Aufruf von <a href="index_m.html#ixb101420"><font color=#000080><tt>mousePressed</tt></font></a>
oder <a href="index_m.html#ixb101417"><font color=#000080><tt>mouseClicked</tt></font></a>
zu überprüfen, ob <a href="index_g.html#ixb101516"><font color=#000080><tt>getClickCount</tt></font></a>
den Wert 2 liefert. In diesem Fall handelt es sich um einen Doppelklick.
Zu beachten ist, dass bei einem Doppelklick zwei aufeinanderfolgende
<a href="index_m.html#ixb101420"><font color=#000080><tt>mousePressed</tt></font></a>-<a href="index_m.html#ixb101421"><font color=#000080><tt>mouseReleased</tt></font></a>-<a href="index_m.html#ixb101417"><font color=#000080><tt>mouseClicked</tt></font></a>-Sequenzen
gesendet werden. In der ersten hat der Zähler den Wert 1, um
den ersten (einfachen) Mausklick zu signalisieren, und erst in der
zweiten steht er auf 2. Vor einem Doppelklick wird also immer erst
der zugehörige Einzelklick übertragen.
<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>
Eine alternative Methode, Doppelklicks zu erkennen, besteht darin,
die Zeitspanne zwischen zwei Klicks und den Abstand der beiden Koordinatenpaare
voneinander zu messen und bei hinreichend kleinen Differenzen einen
Doppelklick anstelle zweier Einfachklicks zu melden. Dazu wird mit
der Methode <a name="ixa101973"><a href="index_g.html#ixb101517"><font color=#000080><tt>getWhen</tt></font></a></a>
der Klasse <a href="index_i.html#ixb101414"><font color=#000080><tt>InputEvent</tt></font></a>
der Zeitpunkt (in Millisekunden) und mit <a href="index_g.html#ixb101411"><font color=#000080><tt>getPoint</tt></font></a>
oder <a href="index_g.html#ixb101511"><font color=#000080><tt>getX</tt></font></a>
und <a href="index_g.html#ixb101512"><font color=#000080><tt>getY</tt></font></a>
die Mausposition zweier aufeinanderfolgender Events bestimmt:</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>
<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#EEFFCC">
<tr>
<td valign=top width=100%>
<font color="#660066">
<pre>
public long getWhen()
</pre>
</font>
</td>
<td valign=top>
<a href="../jdkdocs/api/java/awt/event/InputEvent.html" onClick="this.href=getApiDoc('java.awt.event.InputEvent')"><font color="#660066" size=-1>java.awt.event.InputEvent</font></a></td>
</tr>
</table>
<p>
Diese Vorgehensweise hat den Vorteil, dass die zeitliche und positionelle
Toleranz für Doppelklicks selbst beeinflusst werden kann, was
bei dem oben beschriebenen Standardverfahren nicht möglich ist.
<p>
Neben den bisher besprochenen Methoden stehen die aus <a href="index_i.html#ixb101414"><font color=#000080><tt>InputEvent</tt></font></a>
geerbten Methoden zur Verfügung. <a href="index_i.html#ixb101414"><font color=#000080><tt>InputEvent</tt></font></a>
ist die gemeinsame Basisklasse von <a href="index_m.html#ixb101408"><font color=#000080><tt>MouseEvent</tt></font></a>
und <a href="index_k.html#ixb101412"><font color=#000080><tt>KeyEvent</tt></font></a>
und stellt Methoden zur Verfügung, die generelle Informationen
über den Zustand der Umschalttasten <font color="#007700"><tt>[STRG]</tt></font>,
<font color="#007700"><tt>[ALT]</tt></font>, <font color="#007700"><tt>[UMSCHALT]</tt></font>
oder <font color="#007700"><tt>[META]</tt></font> zum Zeitpunkt des
Ereignisses liefern:
<p>
<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#EEFFCC">
<tr>
<td valign=top width=100%>
<font color="#660066">
<pre>
public boolean isShiftDown()
public boolean isControlDown()
public boolean isMetaDown()
public boolean isAltDown()
</pre>
</font>
</td>
<td valign=top>
<a href="../jdkdocs/api/java/awt/event/InputEvent.html" onClick="this.href=getApiDoc('java.awt.event.InputEvent')"><font color="#660066" size=-1>java.awt.event.InputEvent</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>
Während die Tasten <font color="#007700"><tt>[UMSCHALT]</tt></font>,
<font color="#007700"><tt>[STRG]</tt></font> und <font color="#007700"><tt>[ALT]</tt></font>
erwartungsgemäß die zugehörigen Tasten erkennen, zeigt
<a href="index_i.html#ixb101518"><font color=#000080><tt>isMetaDown</tt></font></a>
unter Windows 95 an, ob der Klick von der rechten oder der linken
Maustaste stammt. Ist der Rückgabewert <a href="index_t.html#ixb100233"><font color=#000080><tt>true</tt></font></a>,
so wurde die rechte Maustaste gedrückt, andernfalls die linke.</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>
Das folgende Programm ist ein einfaches Beispiel für die Reaktion
auf Mausklicks. Es zeichnet an den Stellen, wo die Maustaste gedrückt
wird, einen kleinen Smiley auf den Bildschirm:
<a name="listingid029003"></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">/* Listing2903.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> Listing2903
<font color="#555555">007 </font><font color="#0000AA">extends</font> Frame
<font color="#555555">008 </font>{
<font color="#555555">009 </font> <font color="#0000AA">public</font> <font color="#0000AA">static</font> <font color="#006699">void</font> main(String[] args)
<font color="#555555">010 </font> {
<font color="#555555">011 </font> Listing2903 wnd = <font color="#0000AA">new</font> Listing2903();
<font color="#555555">012 </font> wnd.setSize(300,200);
<font color="#555555">013 </font> wnd.setLocation(200,100);
<font color="#555555">014 </font> wnd.setVisible(<font color="#006699">true</font>);
<font color="#555555">015 </font> }
<font color="#555555">016 </font>
<font color="#555555">017 </font> <font color="#0000AA">public</font> Listing2903()
<font color="#555555">018 </font> {
<font color="#555555">019 </font> <font color="#006699">super</font>(<font color="#0000FF">"Mausklicks"</font>);
<font color="#555555">020 </font> addWindowListener(<font color="#0000AA">new</font> WindowClosingAdapter(<font color="#006699">true</font>));
<font color="#555555">021 </font> addMouseListener(<font color="#0000AA">new</font> MyMouseListener());
<font color="#555555">022 </font> }
<font color="#555555">023 </font>
<font color="#555555">024 </font> <font color="#0000AA">class</font> MyMouseListener
<font color="#555555">025 </font> <font color="#0000AA">extends</font> MouseAdapter
<font color="#555555">026 </font> {
<font color="#555555">027 </font> <font color="#006699">int</font> cnt = 0;
<font color="#555555">028 </font>
<font color="#555555">029 </font> <font color="#0000AA">public</font> <font color="#006699">void</font> mousePressed(MouseEvent event)
<font color="#555555">030 </font> {
<font color="#555555">031 </font> Graphics g = getGraphics();
<font color="#555555">032 </font> <font color="#006699">int</font> x = event.getX();
<font color="#555555">033 </font> <font color="#006699">int</font> y = event.getY();
<font color="#555555">034 </font> <font color="#0000AA">if</font> (event.getClickCount() == 1) { <font color="#00AA00">//Gesicht</font>
<font color="#555555">035 </font> ++cnt;
<font color="#555555">036 </font> <font color="#00AA00">//Kopf und Augen</font>
<font color="#555555">037 </font> g.drawOval(x-10,y-10,20,20);
<font color="#555555">038 </font> g.fillRect(x-6,y-5,4,5);
<font color="#555555">039 </font> g.fillRect(x+3,y-5,4,5);
<font color="#555555">040 </font> <font color="#00AA00">//Mund</font>
<font color="#555555">041 </font> <font color="#0000AA">if</font> (event.isMetaDown()) { <font color="#00AA00">//grimmig</font>
<font color="#555555">042 </font> g.drawLine(x-5,y+7,x+5,y+7);
<font color="#555555">043 </font> } <font color="#0000AA">else</font> { <font color="#00AA00">//lächeln</font>
<font color="#555555">044 </font> g.drawArc(x-7,y-7,14,14,225,100);
<font color="#555555">045 </font> }
<font color="#555555">046 </font> <font color="#00AA00">//Zähler</font>
<font color="#555555">047 </font> g.drawString(<font color="#0000FF">""</font>+cnt,x+10,y-10);
<font color="#555555">048 </font> } <font color="#0000AA">else</font> <font color="#0000AA">if</font> (event.getClickCount() == 2) { <font color="#00AA00">//Brille</font>
<font color="#555555">049 </font> g.drawLine(x-9,y-3,x+9,y-3);
<font color="#555555">050 </font> }
<font color="#555555">051 </font> }
<font color="#555555">052 </font> }
<font color="#555555">053 </font>}</pre>
</font>
</td>
<td valign=top align=right>
<a href="../examples/Listing2903.java"><font color="#000055" size=-1>Listing2903.java</font></a></td>
</tr>
</table>
<i>
Listing 29.3: Reaktion auf Mausklicks</i></p>
<p>
Beim Drücken der linken Maustaste lächelt das Gesicht, bei
der rechten sieht es grimmig aus. Bei einem Doppelklick bekommt der
Smiley zusätzlich eine Brille aufgesetzt. Die Ausgabe des Programms
sieht beispielsweise so aus:
<p>
<a name="imageid029002"></a>
<img src="images/MausKlicks.gif">
<p>
<p><i>
Abbildung 29.2: Die Ausgabe des Mausklick-Programms</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>
Erwähnenswert ist die Tatsache, dass das Programm ohne <a href="index_p.html#ixb101148"><font color=#000080><tt>paint</tt></font></a>-Methode
auskommt. Tatsächlich beschafft die Methode <a href="index_m.html#ixb101420"><font color=#000080><tt>mousePressed</tt></font></a>
sich die zum Zeichnen erforderliche Instanz der Klasse <a href="index_g.html#ixb101149"><font color=#000080><tt>Graphics</tt></font></a>
durch Aufruf von <a href="index_g.html#ixb101294"><font color=#000080><tt>getGraphics</tt></font></a>
selbst. Die Methode <a href="index_g.html#ixb101294"><font color=#000080><tt>getGraphics</tt></font></a>
gibt immer den Grafikkontext des aktuellen Fensterobjekts zurück.
Das gelieferte <a href="index_g.html#ixb101149"><font color=#000080><tt>Graphics</tt></font></a>-Objekt
kann auf dieselbe Weise verwendet werden wie das als Parameter an
<a href="index_p.html#ixb101148"><font color=#000080><tt>paint</tt></font></a>
übergebene.</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>
Leider hat das Beispielprogramm eine gravierende konzeptionelle Schwäche,
denn die gezeichneten Smileys sind nicht <i>dauerhaft</i>. Wird das
Fenster in den Hintergrund gestellt, nachdem einige Mausklicks durchgeführt
wurden, sind bei erneuter Anzeige des Fensters die zuvor gezeichneten
Smileys wieder verschwunden. Der Grund dafür ist, dass wir in
unserem Beispiel nicht die <a href="index_p.html#ixb101148"><font color=#000080><tt>paint</tt></font></a>-Methode
überlagert haben, sondern die Ausgaben als direkte Reaktion auf
ein Mausereignis erledigten. Da Windows nicht dafür sorgt, den
Inhalt eines zuvor verdeckten Fensters zu rekonstruieren, ist die
Anwendung selbst dafür verantwortlich, dies in ihrer <a href="index_p.html#ixb101148"><font color=#000080><tt>paint</tt></font></a>-Methode
zu tun. Eine bessere Implementierung dieses Programms würde also
darin bestehen, die Koordinaten und Eigenschaften aller gezeichneten
Objekte zu speichern und sie beim Aufruf von <a href="index_p.html#ixb101148"><font color=#000080><tt>paint</tt></font></a>
später selbst zu rekonstruieren. Wir werden diese Vorgehensweise
in einem späteren Beispiel genauer kennenlernen.
<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="k100184.html"> << </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100186.html"> < </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100188.html"> > </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100192.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>
|