diff options
| author | Sven Eisenhauer <sven@sven-eisenhauer.net> | 2023-11-10 15:11:48 +0100 |
|---|---|---|
| committer | Sven Eisenhauer <sven@sven-eisenhauer.net> | 2023-11-10 15:11:48 +0100 |
| commit | 33613a85afc4b1481367fbe92a17ee59c240250b (patch) | |
| tree | 670b842326116b376b505ec2263878912fca97e2 /Master/Reference Architectures and Patterns/hjp5/html/k100235.html | |
| download | Studium-33613a85afc4b1481367fbe92a17ee59c240250b.tar.gz Studium-33613a85afc4b1481367fbe92a17ee59c240250b.tar.bz2 | |
Diffstat (limited to 'Master/Reference Architectures and Patterns/hjp5/html/k100235.html')
| -rw-r--r-- | Master/Reference Architectures and Patterns/hjp5/html/k100235.html | 1009 |
1 files changed, 1009 insertions, 0 deletions
diff --git a/Master/Reference Architectures and Patterns/hjp5/html/k100235.html b/Master/Reference Architectures and Patterns/hjp5/html/k100235.html new file mode 100644 index 0000000..7a1a88e --- /dev/null +++ b/Master/Reference Architectures and Patterns/hjp5/html/k100235.html @@ -0,0 +1,1009 @@ +<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,k100232.html;106,k100234.html;107,k100236.html;108,k100237.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="k100232.html"> << </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="k100234.html"> < </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="k100236.html"> > </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="k100237.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 36 - Swing: Container und Menüs
+</table>
+<hr>
+
+
+<!-- Section -->
+<a name="sectlevel2id036003"></a>
+<h2>36.3 Weitere Swing-Container </h2>
+<hr>
+<ul>
+<li><a href="k100235.html#sectlevel2id036003">36.3 Weitere Swing-Container</a>
+<ul>
+<li><a href="k100235.html#sectlevel3id036003001">36.3.1 JComponent</a>
+<ul>
+<li><a href="k100235.html#sectlevel4id036003001001">Umrandungen</a>
+<li><a href="k100235.html#sectlevel4id036003001002">Tooltips</a>
+<li><a href="k100235.html#sectlevel4id036003001003">Bildschirmdarstellung der Komponente</a>
+<li><a href="k100235.html#sectlevel4id036003001004">Debug-Grafik</a>
+<li><a href="k100235.html#sectlevel4id036003001005">Transparenter Hintergrund</a>
+<li><a href="k100235.html#sectlevel4id036003001006">Doppelpufferung</a>
+<li><a href="k100235.html#sectlevel4id036003001007">Größenvorgaben</a>
+<li><a href="k100235.html#sectlevel4id036003001008">Invalidierung/Validierung </a>
+<li><a href="k100235.html#sectlevel4id036003001009">Die Fokusreihenfolge</a>
+<li><a href="k100235.html#sectlevel4id036003001010">Registrieren von Tastaturkommandos</a>
+</ul>
+<li><a href="k100235.html#sectlevel3id036003002">36.3.2 JPanel und JLayeredPane</a>
+<ul>
+<li><a href="k100235.html#sectlevel4id036003002001">JPanel</a>
+<li><a href="k100235.html#sectlevel4id036003002002">JLayeredPane</a>
+</ul>
+</ul>
+</ul>
+<hr>
+
+
+<!-- Section -->
+<a name="sectlevel3id036003001"></a>
+<h3>36.3.1 JComponent </h3>
+
+<p>
+Viele der Swing-Komponenten sind direkt oder indirekt aus der Klasse
+<a name="ixa102509"><a href="index_j.html#ixb101768"><font color=#000080><tt>JComponent</tt></font></a></a>
+abgeleitet. Sie stellt eine Reihe allgemeiner Hilfsmittel zur Verfügung,
+die für daraus abgeleitete Komponentenklassen nützlich sind.
+Als Ableitung von <a href="index_c.html#ixb101353"><font color=#000080><tt>java.awt.Container</tt></font></a>
+(und damit von <a href="index_c.html#ixb101302"><font color=#000080><tt>java.awt.Component</tt></font></a>)
+besitzt <a href="index_j.html#ixb101768"><font color=#000080><tt>JComponent</tt></font></a>
+bereits einen Großteil der Funktionalität von AWT-Komponenten.
+Insbesondere bietet sie als <a href="index_c.html#ixb101353"><font color=#000080><tt>Container</tt></font></a>
+die Möglichkeit, andere Komponenten aufzunehmen, und sie kann
+einen Layout-Manager besitzen, der für die Größe und
+Anordnung der enthaltenen Komponenten zuständig ist.
+
+<p>
+Die mit dem AWT eingeführte grundsätzliche Unterscheidung
+zwischen <i>elementaren</i> Dialogelementen, und solchen, die Unterkomponenten
+aufnehmen können, wurde mit der Einführung von Swing also
+weitgehend fallengelassen. In der Praxis ist das jedoch nur selten
+bedeutsam. Ein <a href="index_j.html#ixb101780"><font color=#000080><tt>JButton</tt></font></a>
+beispielsweise stellt sich im praktischen Gebrauch stets als <i>elementare</i>
+Komponente dar - obwohl er als Konkretisierung von <a href="index_j.html#ixb101768"><font color=#000080><tt>JComponent</tt></font></a>
+auch Unterkomponenten enthalten könnte.
+<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 der auffälligeren Konsequenzen besteht darin, dass es in
+Swing keine zu <a href="index_c.html#ixb101712"><font color=#000080><tt>Canvas</tt></font></a>
+korrespondierende Klasse gibt (siehe <a href="k100219.html#kapitelcanvasundpanel">Kapitel 33</a>.
+Elementare Dialogelemente mit selbstdefinierter Oberfläche werden
+in Swing direkt aus <a href="index_j.html#ixb101768"><font color=#000080><tt>JComponent</tt></font></a>
+abgeleitet.</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>
+
+
+<!-- Section -->
+<a name="sectlevel4id036003001001"></a>
+<h4>Umrandungen </h4>
+
+<p>
+<a href="index_j.html#ixb101768"><font color=#000080><tt>JComponent</tt></font></a>
+bietet die Möglichkeit, ihren Instanzen eine Umrandung zu geben.
+Dazu gibt es die Methode <a name="ixa102510"><a href="index_s.html#ixb101774"><font color=#000080><tt>setBorder</tt></font></a></a>,
+mit der der Komponente ein Objekt des Typs <a href="index_b.html#ixb101775"><font color=#000080><tt>Border</tt></font></a>
+zugewiesen werden 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 setBorder(Border border)
+</pre>
+</font>
+</td>
+<td valign=top>
+<a href="../jdkdocs/api/javax/swing/JComponent.html" onClick="this.href=getApiDoc('javax.swing.JComponent')"><font color="#660066" size=-1>javax.swing.JComponent</font></a></td>
+</tr>
+</table>
+
+<p>
+<a href="index_b.html#ixb101775"><font color=#000080><tt>Border</tt></font></a>
+ist ein Interface, zu dem es verschiedene Implementierungen gibt.
+Die wichtigsten von ihnen zeigt folgende Tabelle: <a name="tableid036004"></a>
+
+<p>
+<table cols=2 border width=100%>
+
+<tr>
+<td valign=top align=left width=20%><b>Klassenname</b></td>
+<td valign=top align=left width=80%><b>Beschreibung</b></td></tr>
+<tr>
+<td valign=top align=left><a name="ixa102511"><a href="index_e.html#ixb101861"><font color=#000080><tt>EmptyBorder</tt></font></a></a></td>
+<td valign=top align=left>Unsichtbarer Rand mit einstellbarer Dicke</td></tr>
+<tr>
+<td valign=top align=left><a name="ixa102512"><a href="index_l.html#ixb101862"><font color=#000080><tt>LineBorder</tt></font></a></a></td>
+<td valign=top align=left>Einfache Linie mit einstellbarer Farbe und
+Dicke</td></tr>
+<tr>
+<td valign=top align=left><a name="ixa102513"><a href="index_b.html#ixb101863"><font color=#000080><tt>BevelBorder</tt></font></a></a></td>
+<td valign=top align=left>Erhabener oder vertiefter 3D-Effekt</td></tr>
+<tr>
+<td valign=top align=left><a name="ixa102514"><a href="index_e.html#ixb101864"><font color=#000080><tt>EtchedBorder</tt></font></a></a></td>
+<td valign=top align=left>Eingelassene Linie mit 3D-Effekt</td></tr>
+<tr>
+<td valign=top align=left><a name="ixa102515"><a href="index_c.html#ixb101865"><font color=#000080><tt>CompoundBorder</tt></font></a></a></td>
+<td valign=top align=left>Aus zwei anderen Umrandungen zusammengesetzt</td></tr>
+<tr>
+<td valign=top align=left><a name="ixa102516"><a href="index_t.html#ixb101866"><font color=#000080><tt>TitledBorder</tt></font></a></a></td>
+<td valign=top align=left>Umrandung mit einem eingebetteten Text</td></tr>
+</table>
+<p><i>
+Tabelle 36.4: Border-Implementierungen</i></p>
+
+<p>
+Die Klassen besitzen sehr unterschiedliche Konstruktoren, mit denen
+ihre jeweiligen Eigenschaften festgelegt werden. Obwohl die <a href="index_b.html#ixb101775"><font color=#000080><tt>Border</tt></font></a>-Instanzen
+einfach mit <a href="index_n.html#ixb100089"><font color=#000080><tt>new</tt></font></a>
+erzeugt werden könnten, bietet die Klasse <a href="index_b.html#ixb101776"><font color=#000080><tt>BorderFactory</tt></font></a>
+im Paket <a href="index_j.html#ixb100192"><font color=#000080><tt>javax.swing</tt></font></a>
+eine bessere Möglichkeit, dies zu tun. Zu jeder Art von Umrandung
+steht nämlich eine Factory-Methode zur Verfügung (<a name="ixa102517"><a href="index_c.html#ixb101867"><font color=#000080><tt>createEmptyBorder</tt></font></a></a>,
+<a name="ixa102518"><a href="index_c.html#ixb101868"><font color=#000080><tt>createLineBorder</tt></font></a></a>
+usw.), mit der ein <a href="index_b.html#ixb101775"><font color=#000080><tt>Border</tt></font></a>-Objekt
+dieses Typs erzeugt werden kann. Wann immer möglich, versucht
+die <a href="index_b.html#ixb101776"><font color=#000080><tt>BorderFactory</tt></font></a>
+dabei, Verweise auf bereits erzeugte Instanzen zurückzugeben.
+Da Umrandungen in GUI-Programmen sehr häufig benötigt werden,
+reduziert sich dadurch bei konsequenter Verwendung die Anzahl der
+kurzlebigen Objekte und die Belastung des Garbage Collectors.
+
+<p>
+<a href="k100235.html#jborderbeispiel">Abbildung 36.11</a> zeigt ein
+Beispielprogramm, das sechs Labels mit unterschiedlichen Umrandungen
+enthält:
+<p>
+<a name="jborderbeispiel"></a>
+<img src="images/JBorder.gif">
+<p>
+
+<p><i>
+Abbildung 36.11: Die wichtigsten Umrandungen</i></p>
+
+
+<!-- Section -->
+<a name="sectlevel4id036003001002"></a>
+<h4><a name="ixa102519">Tooltips</a></h4>
+
+<p>
+<a href="index_j.html#ixb101768"><font color=#000080><tt>JComponent</tt></font></a>
+bietet eine einfach anzuwendende Möglichkeit, Komponenten einen
+Tooltip-Text zuzuweisen. Dieser wird angezeigt, wenn die Maus über
+das Dialogelement bewegt und dort gehalten wird. Ein Tooltip gibt
+dem unerfahrenen Anwender zusätzliche Informationen über
+die Bedeutung und Funktion des ausgewählten Dialogelements. Tooltip-Texte
+werden mit der Methode <a name="ixa102520"><a href="index_s.html#ixb101773"><font color=#000080><tt>setToolTipText</tt></font></a></a>
+zugewiesen. Mit <a name="ixa102521"><a href="index_g.html#ixb101869"><font color=#000080><tt>getToolTipText</tt></font></a></a>
+können sie abgefragt werden:
+<p>
+<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#EEFFCC">
+<tr>
+<td valign=top width=100%>
+<font color="#660066">
+<pre>
+public void setToolTipText(String text)
+public String getToolTipText()
+</pre>
+</font>
+</td>
+<td valign=top>
+<a href="../jdkdocs/api/javax/swing/JComponent.html" onClick="this.href=getApiDoc('javax.swing.JComponent')"><font color="#660066" size=-1>javax.swing.JComponent</font></a></td>
+</tr>
+</table>
+<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>
+Tooltips können nicht nur einfache Texte enthalten, sondern prinzipiell
+beliebig komplex aufgebaut sein. Sie werden durch die aus <a href="index_j.html#ixb101768"><font color=#000080><tt>JComponent</tt></font></a>
+abgleitete Klasse <a name="ixa102522"><a href="index_j.html#ixb101870"><font color=#000080><tt>JToolTip</tt></font></a></a>
+repräsentiert. Aus ihr können anwendungsspezifische Tooltip-Klassen
+abgeleitet werden, die nahezu beliebige GUI-Funktionalitäten
+zur Verfügung stellen. Um einer Komponente einen solchen Tooltip
+zuzuordnen, muss die Methode <a name="ixa102523"><a href="index_c.html#ixb101871"><font color=#000080><tt>createToolTip</tt></font></a></a>
+von <a href="index_j.html#ixb101768"><font color=#000080><tt>JComponent</tt></font></a>
+überlagert werden und auf Anfrage ihr eigenes <a href="index_j.html#ixb101870"><font color=#000080><tt>JToolTip</tt></font></a>-Objekt
+zurückgeben.</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>
+
+
+<!-- Section -->
+<a name="sectlevel4id036003001003"></a>
+<h4>Bildschirmdarstellung der Komponente </h4>
+
+<p>
+Normalerweise braucht eine GUI-Anwendung sich um die konkrete Darstellung
+seiner Dialogelemente keine Gedanken zu machen. Die elementaren Komponenten
+erledigen dies selbst, und die zusammengesetzten Komponenten bedienen
+sich ihrer Layout-Manager und der Ausgabemethoden der elementaren
+Komponenten. Dies ändert sich, wenn eine eigene Komponente entwickelt
+werden soll. Bei AWT-Anwendungen wurde diese aus <a href="index_c.html#ixb101712"><font color=#000080><tt>Canvas</tt></font></a>
+abgeleitet, und in überlagerten Varianten von <a href="index_p.html#ixb101148"><font color=#000080><tt>paint</tt></font></a>
+oder <a href="index_u.html#ixb101747"><font color=#000080><tt>update</tt></font></a>
+wurde die nötige Bildschirmausgabe zur Verfügung gestellt.
+
+<p>
+In elementaren Swing-Komponenten, die aus <a href="index_j.html#ixb101768"><font color=#000080><tt>JComponent</tt></font></a>
+abgeleitet wurden, liegen die Dinge etwas komplizierter. Die Methode
+<a href="index_p.html#ixb101148"><font color=#000080><tt>paint</tt></font></a>
+hat bereits in <a href="index_j.html#ixb101768"><font color=#000080><tt>JComponent</tt></font></a>
+eine recht aufwändige Implementierung und wird normalerweise
+nicht mehr überlagert. Im Prinzip ruft sie nacheinander ihre
+Methoden <a name="ixa102524"><a href="index_p.html#ixb101872"><font color=#000080><tt>paintComponent</tt></font></a></a>,
+<a name="ixa102525"><a href="index_p.html#ixb101873"><font color=#000080><tt>paintBorder</tt></font></a></a>
+und <a name="ixa102526"><a href="index_p.html#ixb101874"><font color=#000080><tt>paintChildren</tt></font></a></a>
+auf. Die letzten beiden sind für das Zeichnen der Umrandung und
+der enthaltenen Dialogelemente zuständig und brauchen normalerweise
+in eigenen Komponenten nicht überlagert zu werden. Für die
+Darstellung der eigenen Komponente ist dagegen <a href="index_p.html#ixb101872"><font color=#000080><tt>paintComponent</tt></font></a>
+zuständig:
+<p>
+<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#EEFFCC">
+<tr>
+<td valign=top width=100%>
+<font color="#660066">
+<pre>
+protected void paintComponent(Graphics g)
+</pre>
+</font>
+</td>
+<td valign=top>
+<a href="../jdkdocs/api/javax/swing/JComponent.html" onClick="this.href=getApiDoc('javax.swing.JComponent')"><font color="#660066" size=-1>javax.swing.JComponent</font></a></td>
+</tr>
+</table>
+
+<p>
+In <a href="index_j.html#ixb101768"><font color=#000080><tt>JComponent</tt></font></a>
+wird jeder Aufruf von <a href="index_p.html#ixb101872"><font color=#000080><tt>paintComponent</tt></font></a>
+an das <a name="ixa102527"><a href="index_c.html#ixb101875"><font color=#000080><tt>ComponentUI</tt></font></a></a>
+der Komponente delegiert. Instanzen dieser im Paket <a name="ixa102528"><a href="index_j.html#ixb101876"><font color=#000080><tt>javax.swing.plaf</tt></font></a></a>
+liegenden Klasse spielen in dem von jeder Swing-Komponente implementierten
+Model-View-Controller-Konzept die Rolle des Views, sind also für
+die grafische Darstellung der Komponente zuständig. Jede Swing-Komponente
+besitzt ein <a href="index_c.html#ixb101875"><font color=#000080><tt>ComponentUI</tt></font></a>,
+das je nach Look-and-Feel unterschiedlich sein kann. Eine selbstdefinierte
+Komponente muss also entweder für jedes unterstützte Look-and-Feel
+ein passendes <a href="index_c.html#ixb101875"><font color=#000080><tt>ComponentUI</tt></font></a>
+zur Verfügung stellen oder die Bildschirmdarstellung durch Überlagern
+von <a href="index_p.html#ixb101872"><font color=#000080><tt>paintComponent</tt></font></a>
+selbst erledigen.
+
+<!-- Section -->
+
+<a name="sectlevel4id036003001004"></a>
+<h4><a name="ixa102529">Debug-Grafik</a></h4>
+
+<p>
+Eine interessante Hilfe zum Testen eigener Komponenten kann durch
+Aufruf der Methode <a name="ixa102530"><a href="index_s.html#ixb101877"><font color=#000080><tt>setDebugGraphicsOptions</tt></font></a></a>
+aktiviert werden:
+<p>
+<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#EEFFCC">
+<tr>
+<td valign=top width=100%>
+<font color="#660066">
+<pre>
+public void setDebugGraphicsOptions(int debugOptions)
+</pre>
+</font>
+</td>
+<td valign=top>
+<a href="../jdkdocs/api/javax/swing/JComponent.html" onClick="this.href=getApiDoc('javax.swing.JComponent')"><font color="#660066" size=-1>javax.swing.JComponent</font></a></td>
+</tr>
+</table>
+
+<p>
+Dadurch wird die Komponente mit Hilfe eines <a name="ixa102531"><a href="index_d.html#ixb101878"><font color=#000080><tt>DebugGraphics</tt></font></a></a>-Objekts
+gezeichnet. Es ist in der Lage, die verwendeten Grafikoperationen
+auf der Console zu protokollieren oder zur besseren Kontrolle verzögert
+auszugeben. Als Argument kann an <a href="index_s.html#ixb101877"><font color=#000080><tt>setDebugGraphicsOptions</tt></font></a>
+eine der folgenden Konstanten aus der Klasse <a name="ixa102531"><a href="index_d.html#ixb101878"><font color=#000080><tt>DebugGraphics</tt></font></a></a>
+übergeben werden: <a name="tableid036005"></a>
+
+<p>
+<table cols=2 border width=100%>
+
+<tr>
+<td valign=top align=left width=25%><b>Konstante</b></td>
+<td valign=top align=left width=75%><b>Bedeutung</b></td></tr>
+<tr>
+<td valign=top align=left><a name="ixa102532"><a href="index_n.html#ixb101879"><font color=#000080><tt>NONE_OPTION</tt></font></a></a></td>
+<td valign=top align=left>Normale Ausgabe</td></tr>
+<tr>
+<td valign=top align=left><a name="ixa102533"><a href="index_l.html#ixb101880"><font color=#000080><tt>LOG_OPTION</tt></font></a></a></td>
+<td valign=top align=left>Die Grafikoperationen werden auf der Console
+protokolliert.</td></tr>
+<tr>
+<td valign=top align=left><a name="ixa102534"><a href="index_f.html#ixb101881"><font color=#000080><tt>FLASH_OPTION</tt></font></a></a></td>
+<td valign=top align=left>Die Grafikoperationen erfolgen verzögert
+und werden während der Ausgabe blinkend dargestellt. Bei dieser
+Option muss die Doppelpufferung für die Komponente ausgeschaltet
+werden.</td></tr>
+<tr>
+<td valign=top align=left><a name="ixa102535"><a href="index_b.html#ixb101882"><font color=#000080><tt>BUFFERED_OPTION</tt></font></a></a></td>
+<td valign=top align=left>Gepufferte Ausgaben werden in einem separaten
+Frame angezeigt (hat im Test nicht funktioniert).</td></tr>
+</table>
+<p><i>
+Tabelle 36.5: DebugGraphics-Konstanten</i></p>
+
+<p>
+Das folgende Programm zeigt eine einfache Anwendung der Debug-Grafik
+zur Darstellung eines Buttons. Mit Hilfe der statischen Methoden <a name="ixa102536"><a href="index_s.html#ixb101883"><font color=#000080><tt>setFlashTime</tt></font></a></a>
+und <a name="ixa102537"><a href="index_s.html#ixb101884"><font color=#000080><tt>setFlashCount</tt></font></a></a>
+der Klasse <a href="index_d.html#ixb101878"><font color=#000080><tt>DebugGraphics</tt></font></a>
+wird die Blinkrate und -dauer angepasst:
+<a name="listingid036011"></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">/* Listing3611.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> javax.swing.*;
+<font color="#555555">005 </font>
+<font color="#555555">006 </font><font color="#0000AA">public</font> <font color="#0000AA">class</font> Listing3611
+<font color="#555555">007 </font><font color="#0000AA">extends</font> JFrame
+<font color="#555555">008 </font>{
+<font color="#555555">009 </font> <font color="#0000AA">public</font> Listing3611()
+<font color="#555555">010 </font> {
+<font color="#555555">011 </font> <font color="#006699">super</font>(<font color="#0000FF">"Debug-Grafik"</font>);
+<font color="#555555">012 </font> addWindowListener(<font color="#0000AA">new</font> WindowClosingAdapter(<font color="#006699">true</font>));
+<font color="#555555">013 </font> Container cp = getContentPane();
+<font color="#555555">014 </font> DebugGraphics.setFlashTime(100);
+<font color="#555555">015 </font> DebugGraphics.setFlashCount(3);
+<font color="#555555">016 </font> JButton button = <font color="#0000AA">new</font> JButton(<font color="#0000FF">"DEBUG-Button"</font>);
+<font color="#555555">017 </font> RepaintManager repaintManager = RepaintManager.currentManager(button);
+<font color="#555555">018 </font> repaintManager.setDoubleBufferingEnabled(<font color="#006699">false</font>);
+<font color="#555555">019 </font> button.setDebugGraphicsOptions(DebugGraphics.FLASH_OPTION);
+<font color="#555555">020 </font> cp.add(button);
+<font color="#555555">021 </font> }
+<font color="#555555">022 </font>
+<font color="#555555">023 </font> <font color="#0000AA">public</font> <font color="#0000AA">static</font> <font color="#006699">void</font> main(String[] args)
+<font color="#555555">024 </font> {
+<font color="#555555">025 </font> Listing3611 frame = <font color="#0000AA">new</font> Listing3611();
+<font color="#555555">026 </font> frame.setLocation(100, 100);
+<font color="#555555">027 </font> frame.setSize(300, 200);
+<font color="#555555">028 </font> frame.setVisible(<font color="#006699">true</font>);
+<font color="#555555">029 </font> }
+<font color="#555555">030 </font>}</pre>
+</font>
+</td>
+<td valign=top align=right>
+<a href="../examples/Listing3611.java"><font color="#000055" size=-1>Listing3611.java</font></a></td>
+</tr>
+</table>
+<i>
+Listing 36.11: Debug-Grafik</i></p>
+
+
+<!-- Section -->
+<a name="sectlevel4id036003001005"></a>
+<h4>Transparenter Hintergrund </h4>
+
+<p>
+Anders als im AWT, bei dem alle Dialogelemente einen undurchsichtigen
+Hintergrund hatten, kann dieser bei Swing-Komponenten auch transparent
+sein. Damit lassen sich runde Buttons, Beschriftungen mit durchscheinendem
+Hintergrund oder ähnliche Effekte realisieren. Um den Hintergrund
+einer Komponente transparent<a name="ixa102538"></a> zu machen, ist
+die Methode <a name="ixa102539"><a href="index_s.html#ixb101886"><font color=#000080><tt>setOpaque</tt></font></a></a>
+aufzurufen und <a href="index_f.html#ixb100234"><font color=#000080><tt>false</tt></font></a>
+zu übergeben. Standardmäßig ist der Hintergrund undurchsichtig.
+Das folgende Programm besitzt zwei Buttons, von denen der eine einen
+transparenten und der andere einen undurchsichtigen Hintergrund hat.
+Um den Unterschied besser erkennen zu können, befinden sie sich
+auf einer Komponente, die vollständig mit Gitterlinien bedeckt
+ist.
+<a name="listingid036012"></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">/* Listing3612.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> javax.swing.*;
+<font color="#555555">005 </font>
+<font color="#555555">006 </font><font color="#0000AA">public</font> <font color="#0000AA">class</font> Listing3612
+<font color="#555555">007 </font><font color="#0000AA">extends</font> JFrame
+<font color="#555555">008 </font>{
+<font color="#555555">009 </font> <font color="#0000AA">public</font> Listing3612()
+<font color="#555555">010 </font> {
+<font color="#555555">011 </font> <font color="#006699">super</font>(<font color="#0000FF">"Transparenz"</font>);
+<font color="#555555">012 </font> addWindowListener(<font color="#0000AA">new</font> WindowClosingAdapter(<font color="#006699">true</font>));
+<font color="#555555">013 </font> Container cp = getContentPane();
+<font color="#555555">014 </font> <font color="#00AA00">//SimpleGridComponent erzeugen</font>
+<font color="#555555">015 </font> SimpleGridComponent grid = <font color="#0000AA">new</font> SimpleGridComponent();
+<font color="#555555">016 </font> grid.setLayout(<font color="#0000AA">new</font> FlowLayout(FlowLayout.CENTER));
+<font color="#555555">017 </font> <font color="#00AA00">//Transparenten Button hinzufügen</font>
+<font color="#555555">018 </font> JButton button = <font color="#0000AA">new</font> JButton(<font color="#0000FF">"Transparent"</font>);
+<font color="#555555">019 </font> button.setOpaque(<font color="#006699">false</font>);
+<font color="#555555">020 </font> grid.add(button);
+<font color="#555555">021 </font> <font color="#00AA00">//Undurchsichtigen Button hinzufügen</font>
+<font color="#555555">022 </font> button = <font color="#0000AA">new</font> JButton(<font color="#0000FF">"Opaque"</font>);
+<font color="#555555">023 </font> grid.add(button);
+<font color="#555555">024 </font> <font color="#00AA00">//SimpleGridComponent hinzufügen</font>
+<font color="#555555">025 </font> cp.add(grid, BorderLayout.CENTER);
+<font color="#555555">026 </font> }
+<font color="#555555">027 </font>
+<font color="#555555">028 </font> <font color="#0000AA">public</font> <font color="#0000AA">static</font> <font color="#006699">void</font> main(String[] args)
+<font color="#555555">029 </font> {
+<font color="#555555">030 </font> <font color="#0000AA">try</font> {
+<font color="#555555">031 </font> String plaf = <font color="#0000FF">"com.sun.java.swing.plaf.windows.WindowsLookAndFeel"</font>;
+<font color="#555555">032 </font> UIManager.setLookAndFeel(plaf);
+<font color="#555555">033 </font> Listing3612 frame = <font color="#0000AA">new</font> Listing3612();
+<font color="#555555">034 </font> frame.setLocation(100, 100);
+<font color="#555555">035 </font> frame.setSize(300, 100);
+<font color="#555555">036 </font> frame.setVisible(<font color="#006699">true</font>);
+<font color="#555555">037 </font> } <font color="#0000AA">catch</font> (Exception e) {
+<font color="#555555">038 </font> e.printStackTrace();
+<font color="#555555">039 </font> System.exit(1);
+<font color="#555555">040 </font> }
+<font color="#555555">041 </font> }
+<font color="#555555">042 </font>}
+<font color="#555555">043 </font>
+<font color="#555555">044 </font><font color="#0000AA">class</font> SimpleGridComponent
+<font color="#555555">045 </font><font color="#0000AA">extends</font> JComponent
+<font color="#555555">046 </font>{
+<font color="#555555">047 </font> <font color="#0000AA">protected</font> <font color="#006699">void</font> paintComponent(Graphics g)
+<font color="#555555">048 </font> {
+<font color="#555555">049 </font> <font color="#006699">int</font> width = getSize().width;
+<font color="#555555">050 </font> <font color="#006699">int</font> height = getSize().height;
+<font color="#555555">051 </font> g.setColor(Color.gray);
+<font color="#555555">052 </font> <font color="#0000AA">for</font> (<font color="#006699">int</font> i = 0; i < width; i += 10) {
+<font color="#555555">053 </font> g.drawLine(i, 0, i, height);
+<font color="#555555">054 </font> }
+<font color="#555555">055 </font> <font color="#0000AA">for</font> (<font color="#006699">int</font> i = 0; i < height; i += 10) {
+<font color="#555555">056 </font> g.drawLine(0, i, width, i);
+<font color="#555555">057 </font> }
+<font color="#555555">058 </font> }
+<font color="#555555">059 </font>}</pre>
+</font>
+</td>
+<td valign=top align=right>
+<a href="../examples/Listing3612.java"><font color="#000055" size=-1>Listing3612.java</font></a></td>
+</tr>
+</table>
+<i>
+Listing 36.12: Ein transparenter Button</i></p>
+
+<p>
+Die Ausgabe des Programms sieht so aus:
+<p>
+<a name="imageid036012"></a>
+<img src="images/TranspButton.gif">
+<p>
+
+<p><i>
+Abbildung 36.12: Ein Programm mit einem transparenten Button</i></p>
+
+
+<!-- Section -->
+<a name="sectlevel4id036003001006"></a>
+<h4>Doppelpufferung </h4>
+
+<p>
+Um bei animierten Komponenten das Bildschirmflackern zu vermeiden,
+kann die Technik des Doppelpufferns angewendet werden. Wir haben das
+für AWT-Komponenten in <a href="k100226.html#flackernreduzieren">Abschnitt 34.2.4</a>
+ausführlich erklärt. Swing-Komponenten, die aus <a href="index_j.html#ixb101768"><font color=#000080><tt>JComponent</tt></font></a>
+abgeleitet sind, können automatisch doppelgepuffert werden. Dazu
+ist lediglich ein Aufruf von <a name="ixa102540"><a href="index_s.html#ixb101887"><font color=#000080><tt>setDoubleBuffered</tt></font></a></a>
+mit Übergabe von <a href="index_t.html#ixb100233"><font color=#000080><tt>true</tt></font></a>
+erforderlich. Mit <a name="ixa102541"><a href="index_i.html#ixb101888"><font color=#000080><tt>isDoubleBuffered</tt></font></a></a>
+kann der aktuelle Zustand dieser Eigenschaft abgefragt werden:
+<p>
+<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#EEFFCC">
+<tr>
+<td valign=top width=100%>
+<font color="#660066">
+<pre>
+public void setDoubleBuffered(boolean aFlag)
+public boolean isDoubleBuffered()
+</pre>
+</font>
+</td>
+<td valign=top>
+<a href="../jdkdocs/api/javax/swing/JComponent.html" onClick="this.href=getApiDoc('javax.swing.JComponent')"><font color="#660066" size=-1>javax.swing.JComponent</font></a></td>
+</tr>
+</table>
+
+
+<!-- Section -->
+<a name="sectlevel4id036003001007"></a>
+<h4>Größenvorgaben </h4>
+
+<p>
+Bereits in der Klasse <a href="index_c.html#ixb101302"><font color=#000080><tt>Component</tt></font></a>
+sind die Methoden <a name="ixa102542"><a href="index_g.html#ixb101715"><font color=#000080><tt>getMinimumSize</tt></font></a></a>,
+<a name="ixa102543"><a href="index_g.html#ixb101706"><font color=#000080><tt>getPreferredSize</tt></font></a></a>
+und <a name="ixa102544"><a href="index_g.html#ixb101717"><font color=#000080><tt>getMaximumSize</tt></font></a></a>
+definiert. Sie werden in abgeleiteten Klassen überlagert, um
+dem Layoutmanager die minimale, optimale und maximale Größe
+der Komponenten mitzuteilen (siehe z.B. <a href="k100221.html#gui7segmentanzeige">Abschnitt 33.2.2</a>).
+In <a href="index_j.html#ixb101768"><font color=#000080><tt>JComponent</tt></font></a>
+gibt es zusätzlich die Methoden <a name="ixa102545"><a href="index_s.html#ixb101889"><font color=#000080><tt>setMinimumSize</tt></font></a></a>,
+<a name="ixa102546"><a href="index_s.html#ixb101890"><font color=#000080><tt>setPreferredSize</tt></font></a></a>
+und <a name="ixa102547"><a href="index_s.html#ixb101891"><font color=#000080><tt>setMaximumSize</tt></font></a></a>.
+Damit können die Größenvorgaben bestehender Komponenten
+verändert werden, ohne eine neue Klasse daraus ableiten zu müssen.
+
+
+<!-- Section -->
+<a name="sectlevel4id036003001008"></a>
+<h4>Invalidierung/Validierung <a name="ixa102548"></a><a name="ixa102549"></a>
+</h4>
+
+<p>
+Sowohl in Swing- als auch in AWT-Programmen kann der Aufbau eines
+Dialogs geändert werden, wenn er bereits auf dem Bildschirm sichtbar
+ist. Dialogelemente können hinzugefügt oder entfernt oder
+in ihrem Aussehen geändert werden. Die dadurch implizierten Layoutänderungen
+werden zwar oft, aber nicht immer automatisch erkannt, und es kann
+sein, dass die Bildschirmdarstellung die Änderungen nicht angemessen
+wiedergibt.
+
+<p>
+Wird beispielsweise die Beschriftung oder der Font eines Swing-Buttons
+verändert, so wird seine Größe den neuen Erfordernissen
+angepasst und der Dialog neu aufgebaut. Bei AWT-Buttons ist das nicht
+der Fall. Wenn sich der Platzbedarf für die Beschriftung ändert,
+ist der Button nach der Änderung entweder zu klein oder zu groß.
+Auch wenn neue Dialogelemente hinzugefügt werden, sind diese
+weder im AWT noch in Swing unmittelbar sichtbar.
+
+<p>
+Um einem Container mitzuteilen, dass das Layout seiner Komponenten
+komplett neu aufgebaut werden soll, ist dessen <a name="ixa102550"><a href="index_v.html#ixb101894"><font color=#000080><tt>validate</tt></font></a></a>-Methode
+aufzurufen:
+<p>
+<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#EEFFCC">
+<tr>
+<td valign=top width=100%>
+<font color="#660066">
+<pre>
+public void validate()
+</pre>
+</font>
+</td>
+<td valign=top>
+<a href="../jdkdocs/api/java/awt/Container.html" onClick="this.href=getApiDoc('java.awt.Container')"><font color="#660066" size=-1>java.awt.Container</font></a></td>
+</tr>
+</table>
+
+<p>
+Um einen unnötigen Neuaufbau des Bildschirms zu vermeiden, wird
+<a href="index_v.html#ixb101894"><font color=#000080><tt>validate</tt></font></a>
+allerdings nur dann <i>wirklich</i> aktiv, wenn der Container, auf
+dem der Aufruf erfolgte, zuvor mit <a name="ixa102551"><a href="index_i.html#ixb101895"><font color=#000080><tt>invalidate</tt></font></a></a>
+als ungültig deklariert wurde:
+<p>
+<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#EEFFCC">
+<tr>
+<td valign=top width=100%>
+<font color="#660066">
+<pre>
+public void invalidate()
+</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>
+Wird <a href="index_i.html#ixb101895"><font color=#000080><tt>invalidate</tt></font></a>
+auf einer elementaren Komponente aufgerufen, die in einen Container
+eingebettet ist, wird der Aufruf an den Container weitergegeben und
+invalidiert auch diesen. Soll also nach der Änderung einer Komponente
+der zugehörige Container neu dargestellt werden, ist auf der
+Komponente <a href="index_i.html#ixb101895"><font color=#000080><tt>invalidate</tt></font></a>
+und anschließend auf dem Container <a href="index_v.html#ixb101894"><font color=#000080><tt>validate</tt></font></a>
+aufzurufen. In <a href="index_j.html#ixb101768"><font color=#000080><tt>JComponent</tt></font></a>
+gibt es zusätzlich die Methode <a name="ixa102552"><a href="index_r.html#ixb101896"><font color=#000080><tt>revalidate</tt></font></a></a>,
+die beide Schritte nacheinander durchführt.
+
+<!-- Section -->
+
+<a name="sectlevel4id036003001009"></a>
+<h4>Die Fokusreihenfolge </h4>
+
+<p>
+Innerhalb eines Dialogs kann immer nur eine Komponente zur Zeit den
+Fokus haben, also Maus- und Tastaturereignisse erhalten. Durch Anklicken
+mit der Maus kann dieser direkt einer bestimmten Komponente zugewiesen
+werden. Alternativ kann (meist mit Hilfe der Tasten <font color="#007700"><tt>[TAB]</tt></font>
+und <font color="#007700"><tt>[UMSCHALT]</tt></font>+<font color="#007700"><tt>[TAB]</tt></font>)
+der Fokus auch per Tastendruck verändert werden. Die Komponenten
+eines Dialogs durchlaufen dabei einen Zyklus, der sich an der Einfüge-Reihenfolge
+der Elemente orientiert. Das zuerst mit <a href="index_a.html#ixb100727"><font color=#000080><tt>add</tt></font></a>
+hinzugefügte Element enthält nach dem Aufrufen des Dialogs
+den Fokus zuerst.
+
+<p>
+Mitunter ist es sinnvoll, lokale Fokuszyklen zu bilden, um Gruppen
+von Komponenten zusammenzufassen und einfacher bedienen zu können.
+Gruppierte Radiobuttons erledigen das beispielsweise automatisch.
+Mit Hilfe der Methode <a name="ixa102553"><a href="index_s.html#ixb101897"><font color=#000080><tt>setNextFocusableComponent</tt></font></a></a>
+der Klasse <a href="index_j.html#ixb101768"><font color=#000080><tt>JComponent</tt></font></a>
+kann dies aber auch manuell erfolgen:
+<p>
+<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#EEFFCC">
+<tr>
+<td valign=top width=100%>
+<font color="#660066">
+<pre>
+public void setNextFocusableComponent(Component aComponent)
+</pre>
+</font>
+</td>
+<td valign=top>
+<a href="../jdkdocs/api/javax/swing/JComponent.html" onClick="this.href=getApiDoc('javax.swing.JComponent')"><font color="#660066" size=-1>javax.swing.JComponent</font></a></td>
+</tr>
+</table>
+
+<p>
+Wird diese Methode auf einer beliebigen Komponente aufgerufen, erhält
+das als Argument übergebene Element den nächsten Fokus.
+Handelt es sich dabei um ein Element, das in der Fokusreihenfolge
+vor dem aktuellen Element liegt, wird auf diese Weise ein lokaler
+Zyklus gebildet, der mit der Tastatur nicht mehr verlassen werden
+kann (mit der Maus natürlich schon). Auch beim umgekehrten Durchlauf
+wird automatisch die neue Reihenfolge eingehalten; eine Methode <font color="#000077"><tt>setPreviousFocusableComponent</tt></font>
+wird dazu nicht benötigt.
+<p>
+<table border=0 cellspacing=0 cellpadding=0 width=100%>
+<tr>
+<td width=1 align=left valign=top bgcolor="#FF9900"><img src="trp1_1.gif"></td>
+<td><img src="trp1_1.gif" width=1></td>
+<td width=1 align=left valign=top bgcolor="#FF9900"><img src="trp1_1.gif"></td>
+<td><img src="trp1_1.gif" width=2></td>
+<td valign=top width=1000>
+
+<p>
+Mit dem JDK 1.4 wurde das Fokus-Subsystem vollständig neu geschrieben.
+Hauptziel dieser Änderung war es, eine große Zahl von existierenden
+Fehlern zu beheben, sowie ein wohldefiniertes und plattformunabhängiges
+Fokus-Verhalten zu implementieren. In der JDK-Doku findet sich im
+»Guide To Features« im Abschnitt »Abstract Window Toolkit«
+eine ausführliche Beschreibung mit dem Titel <a name="ixa102554"><i>Focus Model Specification</i></a>.</td>
+<td><img src="trp1_1.gif" width=2></td>
+<td valign=top>
+<table border=0 cellspacing=0 cellpadding=1 width=100% bgcolor="#FF9900">
+<tr>
+<td><font color="#FFFFFF"> JDK1.1-6.0 </font></td>
+</tr>
+</table>
+</td>
+<td width=1 align=left valign=top bgcolor="#FF9900"><img src="trp1_1.gif"></td>
+</tr>
+</table>
+
+
+<!-- Section -->
+<a name="sectlevel4id036003001010"></a>
+<h4>Registrieren von Tastaturkommandos </h4>
+
+<p>
+Als letzte Eigenschaft der Klasse <a href="index_j.html#ixb101768"><font color=#000080><tt>JComponent</tt></font></a>
+wollen wir uns das Registrieren von Tastaturkommandos ansehen. Dabei
+wird eine bestimmte Tastenkombination bei einer Komponente angemeldet
+und löst bei jeder Anwendung ein Action-Event aus. Tastaturkommandos
+können sowohl bei elementaren Komponenten als auch bei Containern
+angemeldet werden, und es gibt verschiedene Möglichkeiten, sie
+vom Fokus der Komponente abhängig zu machen. Das Registrieren
+erfolgt mit der Methode <a name="ixa102555"><a href="index_r.html#ixb101899"><font color=#000080><tt>registerKeyboardAction</tt></font></a></a>:
+<p>
+<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#EEFFCC">
+<tr>
+<td valign=top width=100%>
+<font color="#660066">
+<pre>
+public void registerKeyboardAction(
+ ActionListener anAction,
+ String aCommand,
+ KeyStroke aKeyStroke,
+ int aCondition
+)
+</pre>
+</font>
+</td>
+<td valign=top>
+<a href="../jdkdocs/api/javax/swing/JComponent.html" onClick="this.href=getApiDoc('javax.swing.JComponent')"><font color="#660066" size=-1>javax.swing.JComponent</font></a></td>
+</tr>
+</table>
+
+<p>
+Deren erstes Argument ist der <a href="index_a.html#ixb101469"><font color=#000080><tt>ActionListener</tt></font></a>,
+der im Falle des Tastendrucks (mit dem Kommando <font color="#000077"><tt>aCommand</tt></font>)
+aufgerufen werden soll. <font color="#000077"><tt>aKeyStroke</tt></font>
+definiert die zu registrierende Tastenkombination (wie man <a href="index_k.html#ixb101836"><font color=#000080><tt>KeyStroke</tt></font></a>-Objekte
+erzeugt, wurde in <a href="k100234.html#simpleswingmenu">Listing 36.8</a>
+gezeigt). Das letzte Argument gibt an, in welcher Relation der Fokus
+zur Komponente stehen muss, damit das Kommando aktiv wird. Er kann
+einen der folgenden Werte annehmen: <a name="tableid036006"></a>
+
+<p>
+<table cols=2 border width=100%>
+
+<tr>
+<td valign=top align=left width=33%><b>Konstante</b></td>
+<td valign=top align=left width=66%><b>Bedeutung</b></td></tr>
+<tr>
+<td valign=top align=left><a name="ixa102556"><a href="index_w.html#ixb101900"><font color=#000080><tt>WHEN_FOCUSED</tt></font></a></a></td>
+<td valign=top align=left>Das Tastaturkommando wird nur ausgelöst,
+wenn die Komponente den Fokus hat.</td></tr>
+<tr>
+<td valign=top align=left><a name="ixa102557"><a href="index_w.html#ixb101901"><font color=#000080><tt>WHEN_IN_FOCUSED_WINDOW</tt></font></a></a></td>
+<td valign=top align=left>Das Tastaturkommando wird ausgelöst,
+wenn die Komponente den Fokus hat oder wenn sie zu einem Container
+gehört, der gerade den Fokus hat.</td></tr>
+<tr>
+<td valign=top align=left><a name="ixa102558"><a href="index_w.html#ixb101902"><font color=#000080><tt>WHEN_ANCESTOR_OF_FOCUSED_COMPONENT</tt></font></a></a></td>
+<td valign=top align=left>Das Tastaturkommando wird ausgelöst,
+wenn die Komponente oder eines der darin enthaltenen Elemente den
+Fokus hat.</td></tr>
+</table>
+<p><i>
+Tabelle 36.6: Bedingungen zur Registrierung von Tastaturkommandos</i></p>
+
+<p>
+Bei der Verwendung der zweiten und dritten Variante werden die Tastendrücke
+immer dann ausgeführt, wenn der Container selbst oder eine der
+darin enthaltenen Komponenten den Fokus hat. Der Unterschied besteht
+in der Sichtweise. <a href="index_w.html#ixb101901"><font color=#000080><tt>WHEN_IN_FOCUSED_WINDOW</tt></font></a>
+wird auf die elementaren Komponenten angewendet, während <a href="index_w.html#ixb101902"><font color=#000080><tt>WHEN_ANCESTOR_OF_FOCUSED_COMPONENT</tt></font></a>
+für den Container selbst vorgesehen ist.
+
+<p>
+Das folgende Programm zeigt eine beispielhafte Anwendung für
+das Registrieren von Tastaturkommandos:
+<a name="listingid036013"></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">/* Listing3613.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="#0000AA">import</font> javax.swing.*;
+<font color="#555555">006 </font><font color="#0000AA">import</font> javax.swing.border.*;
+<font color="#555555">007 </font>
+<font color="#555555">008 </font><font color="#0000AA">public</font> <font color="#0000AA">class</font> Listing3613
+<font color="#555555">009 </font><font color="#0000AA">extends</font> JFrame
+<font color="#555555">010 </font><font color="#0000AA">implements</font> ActionListener
+<font color="#555555">011 </font>{
+<font color="#555555">012 </font> <font color="#0000AA">public</font> Listing3613()
+<font color="#555555">013 </font> {
+<font color="#555555">014 </font> <font color="#006699">super</font>(<font color="#0000FF">"Invalidierung"</font>);
+<font color="#555555">015 </font> addWindowListener(<font color="#0000AA">new</font> WindowClosingAdapter(<font color="#006699">true</font>));
+<font color="#555555">016 </font> Container cp = getContentPane();
+<font color="#555555">017 </font> ((JComponent)cp).setBorder(<font color="#0000AA">new</font> EmptyBorder(5, 5, 5, 5));
+<font color="#555555">018 </font> cp.setLayout(<font color="#0000AA">new</font> FlowLayout());
+<font color="#555555">019 </font> <font color="#00AA00">//Textfelder erzeugen</font>
+<font color="#555555">020 </font> JTextField tf1 = <font color="#0000AA">new</font> JTextField(<font color="#0000FF">"Zeile1"</font>, 20);
+<font color="#555555">021 </font> JTextField tf2 = <font color="#0000AA">new</font> JTextField(<font color="#0000FF">"Zeile2"</font>, 20);
+<font color="#555555">022 </font> JTextField tf3 = <font color="#0000AA">new</font> JTextField(<font color="#0000FF">"Zeile3"</font>, 20);
+<font color="#555555">023 </font> <font color="#00AA00">//STRG+UMSCHALT+F6 auf Frame registrieren</font>
+<font color="#555555">024 </font> ((JComponent)cp).registerKeyboardAction(
+<font color="#555555">025 </font> <font color="#006699">this</font>,
+<font color="#555555">026 </font> <font color="#0000FF">"dialog"</font>,
+<font color="#555555">027 </font> ctrlShift(KeyEvent.VK_F6),
+<font color="#555555">028 </font> JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT
+<font color="#555555">029 </font> );
+<font color="#555555">030 </font> <font color="#00AA00">//STRG+UMSCHALT+F7 auf tf1 registrieren</font>
+<font color="#555555">031 </font> tf1.registerKeyboardAction(
+<font color="#555555">032 </font> <font color="#006699">this</font>,
+<font color="#555555">033 </font> <font color="#0000FF">"tf1"</font>,
+<font color="#555555">034 </font> ctrlShift(KeyEvent.VK_F7),
+<font color="#555555">035 </font> JComponent.WHEN_IN_FOCUSED_WINDOW
+<font color="#555555">036 </font> );
+<font color="#555555">037 </font> <font color="#00AA00">//STRG+UMSCHALT+F8 auf tf2 registrieren</font>
+<font color="#555555">038 </font> tf2.registerKeyboardAction(
+<font color="#555555">039 </font> <font color="#006699">this</font>,
+<font color="#555555">040 </font> <font color="#0000FF">"tf2"</font>,
+<font color="#555555">041 </font> ctrlShift(KeyEvent.VK_F8),
+<font color="#555555">042 </font> JComponent.WHEN_FOCUSED
+<font color="#555555">043 </font> );
+<font color="#555555">044 </font> <font color="#00AA00">//Textfelder hinzufügen</font>
+<font color="#555555">045 </font> cp.add(tf1);
+<font color="#555555">046 </font> cp.add(tf2);
+<font color="#555555">047 </font> cp.add(tf3);
+<font color="#555555">048 </font> }
+<font color="#555555">049 </font>
+<font color="#555555">050 </font> <font color="#0000AA">public</font> <font color="#006699">void</font> actionPerformed(ActionEvent event)
+<font color="#555555">051 </font> {
+<font color="#555555">052 </font> String cmd = event.getActionCommand();
+<font color="#555555">053 </font> System.out.println(cmd);
+<font color="#555555">054 </font> }
+<font color="#555555">055 </font>
+<font color="#555555">056 </font> <font color="#0000AA">private</font> KeyStroke ctrlShift(<font color="#006699">int</font> vkey)
+<font color="#555555">057 </font> {
+<font color="#555555">058 </font> <font color="#0000AA">return</font> KeyStroke.getKeyStroke(
+<font color="#555555">059 </font> vkey,
+<font color="#555555">060 </font> Event.SHIFT_MASK + Event.CTRL_MASK
+<font color="#555555">061 </font> );
+<font color="#555555">062 </font> }
+<font color="#555555">063 </font>
+<font color="#555555">064 </font> <font color="#0000AA">public</font> <font color="#0000AA">static</font> <font color="#006699">void</font> main(String[] args)
+<font color="#555555">065 </font> {
+<font color="#555555">066 </font> Listing3613 frame = <font color="#0000AA">new</font> Listing3613();
+<font color="#555555">067 </font> frame.setLocation(100, 100);
+<font color="#555555">068 </font> frame.setSize(300, 200);
+<font color="#555555">069 </font> frame.setVisible(<font color="#006699">true</font>);
+<font color="#555555">070 </font> }
+<font color="#555555">071 </font>}</pre>
+</font>
+</td>
+<td valign=top align=right>
+<a href="../examples/Listing3613.java"><font color="#000055" size=-1>Listing3613.java</font></a></td>
+</tr>
+</table>
+<i>
+Listing 36.13: Registrieren von Tastaturkommandos</i></p>
+
+<p>
+Das Hauptfenster selbst registriert die Tastenkombination <font color="#007700"><tt>[STRG]</tt></font>+<font color="#007700"><tt>[UMSCHALT]</tt></font>+<font color="#007700"><tt>[F6]</tt></font>.
+Sie funktioniert unabhängig davon, welches der drei Textfelder
+den Fokus hat. Das oberste Textfeld registriert <font color="#007700"><tt>[STRG]</tt></font>+<font color="#007700"><tt>[UMSCHALT]</tt></font>+<font color="#007700"><tt>[F7]</tt></font>
+mit der Bedingung <a href="index_w.html#ixb101901"><font color=#000080><tt>WHEN_IN_FOCUSED_WINDOW</tt></font></a>.
+Die Tastenkombination steht in diesem Dialog also ebenfalls immer
+zur Verfügung. Das nächste Textfeld registriert <font color="#007700"><tt>[STRG]</tt></font>+<font color="#007700"><tt>[UMSCHALT]</tt></font>+<font color="#007700"><tt>[F8]</tt></font>,
+läßt sie allerdings nur zu, wenn es selbst den Fokus hat.
+
+
+<!-- Section -->
+<a name="sectlevel3id036003002"></a>
+<h3>36.3.2 JPanel und JLayeredPane </h3>
+
+
+<!-- Section -->
+<a name="sectlevel4id036003002001"></a>
+<h4>JPanel </h4>
+
+<p>
+<a name="ixa102559"><a href="index_j.html#ixb101767"><font color=#000080><tt>JPanel</tt></font></a></a>
+ist die Basisklasse für GUI-Container in Swing, die nicht Hauptfenster
+sind. Sie ist direkt aus <a href="index_j.html#ixb101768"><font color=#000080><tt>JComponent</tt></font></a>
+abgeleitet und fügt dieser nur wenig hinzu. Wichtigstes Unterscheidungsmerkmal
+ist die Tatsache, dass einem <a href="index_j.html#ixb101767"><font color=#000080><tt>JPanel</tt></font></a>
+standardmäßig ein <a href="index_f.html#ixb101598"><font color=#000080><tt>FlowLayout</tt></font></a>
+als Layoutmanager zugeordnet ist. Instanzen von <a href="index_j.html#ixb101768"><font color=#000080><tt>JComponent</tt></font></a>
+besitzten dagegen zunächst keinen Layoutmanager. <a href="index_j.html#ixb101767"><font color=#000080><tt>JPanel</tt></font></a>
+definiert die folgenden Konstruktoren:
+<p>
+<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#EEFFCC">
+<tr>
+<td valign=top width=100%>
+<font color="#660066">
+<pre>
+public JPanel()
+public JPanel(boolean isDoubleBuffered)
+public JPanel(LayoutManager layout)
+public JPanel(LayoutManager layout, boolean isDoubleBuffered)
+</pre>
+</font>
+</td>
+<td valign=top>
+<a href="../jdkdocs/api/javax/swing/JPanel.html" onClick="this.href=getApiDoc('javax.swing.JPanel')"><font color="#660066" size=-1>javax.swing.JPanel</font></a></td>
+</tr>
+</table>
+
+<p>
+Der parameterlose Konstruktor erzeugt ein <a href="index_j.html#ixb101767"><font color=#000080><tt>JPanel</tt></font></a>
+mit Doppelpufferung und einem <a href="index_f.html#ixb101598"><font color=#000080><tt>FlowLayout</tt></font></a>.
+Wahlweise können beide Eigenschaften durch Setzen der Argumente
+<font color="#000077"><tt>isDoubleBuffered</tt></font> und <font color="#000077"><tt>layout</tt></font>
+geändert werden. In der weiteren Anwendung ist <a href="index_j.html#ixb101767"><font color=#000080><tt>JPanel</tt></font></a>
+mit <a href="index_j.html#ixb101768"><font color=#000080><tt>JComponent</tt></font></a>
+identisch.
+
+<!-- Section -->
+
+<a name="sectlevel4id036003002002"></a>
+<h4>JLayeredPane </h4>
+
+<p>
+Eine weitere Container-Klasse, die direkt aus <a href="index_j.html#ixb101768"><font color=#000080><tt>JComponent</tt></font></a>
+abgeleitet wurde, ist <a name="ixa102560"><a href="index_j.html#ixb101790"><font color=#000080><tt>JLayeredPane</tt></font></a></a>.
+Sie fügt den Dialogen eine dritte Dimension hinzu und ermöglicht
+mit Hilfe eines Layerkonzepts die kontrollierte Anordnung von Komponenten
+übereinander. <a href="index_j.html#ixb101790"><font color=#000080><tt>JLayeredPane</tt></font></a>
+ist Vaterklasse von <a href="index_j.html#ixb101819"><font color=#000080><tt>JDesktopPane</tt></font></a>
+(siehe <a href="k100233.html#jinternalframe">Abschnitt 36.1.6</a>)
+und wichtiger Bestandteil der Struktur von Hauptfenstern (siehe <a href="k100233.html#jframestruktur">Abschnitt 36.1.1</a>).
+In der praktischen Anwendung wird sie nur selten direkt gebraucht,
+und wir wollen nicht weiter darauf eingehen.
+<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="k100232.html"> << </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="k100234.html"> < </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="k100236.html"> > </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="k100237.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>
|
