diff options
Diffstat (limited to 'Master/Reference Architectures and Patterns/hjp5/html/k100225.html')
| -rw-r--r-- | Master/Reference Architectures and Patterns/hjp5/html/k100225.html | 664 |
1 files changed, 664 insertions, 0 deletions
diff --git a/Master/Reference Architectures and Patterns/hjp5/html/k100225.html b/Master/Reference Architectures and Patterns/hjp5/html/k100225.html new file mode 100644 index 0000000..8c26d5f --- /dev/null +++ b/Master/Reference Architectures and Patterns/hjp5/html/k100225.html @@ -0,0 +1,664 @@ +<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,k100224.html;106,k100224.html;107,k100226.html;108,k100228.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="k100224.html"> << </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="k100224.html"> < </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="k100226.html"> > </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="k100228.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 34 - Bitmaps und Animationen
+</table>
+<hr>
+
+
+<!-- Section -->
+<a name="sectlevel2id034001"></a>
+<h2>34.1 Bitmaps </h2>
+<hr>
+<ul>
+<li><a href="k100225.html#sectlevel2id034001">34.1 Bitmaps</a>
+<ul>
+<li><a href="k100225.html#bitmapladenanzeigen">34.1.1 Laden und Anzeigen einer Bitmap</a>
+<ul>
+<li><a href="k100225.html#sectlevel4id034001001001">Die Klasse MediaTracker</a>
+</ul>
+<li><a href="k100225.html#entwicklungbitmapkomponente">34.1.2 Entwicklung einer eigenen Bitmap-Komponente</a>
+</ul>
+</ul>
+<hr>
+
+
+<!-- Section -->
+<a name="bitmapladenanzeigen"></a>
+<h3>34.1.1 Laden und Anzeigen einer Bitmap<a name="ixa102320"></a>
+</h3>
+
+<p>
+Das Anzeigen einer Bitmap kann in zwei Schritte unterteilt werden:
+<ul>
+<li>das Laden der Bitmap von einem externen Speichermedium oder aus
+dem Netz
+<li>die eigentliche Ausgabe auf den Bildschirm
+</ul>
+
+<p>
+Das Laden erfolgt mit der Methode <a name="ixa102321"><a href="index_g.html#ixb101732"><font color=#000080><tt>getImage</tt></font></a></a>,
+die eine Instanz der Klasse <a name="ixa102322"><a href="index_i.html#ixb100643"><font color=#000080><tt>Image</tt></font></a></a>
+zurückgibt. Das <a href="index_i.html#ixb100643"><font color=#000080><tt>Image</tt></font></a>-Objekt
+kann dann mit der Methode <a name="ixa102323"><a href="index_d.html#ixb101733"><font color=#000080><tt>drawImage</tt></font></a></a>
+der Klasse <a href="index_g.html#ixb101149"><font color=#000080><tt>Graphics</tt></font></a>
+angezeigt werden.
+
+<p>
+<a href="index_g.html#ixb101732"><font color=#000080><tt>getImage</tt></font></a>
+gibt es in verschiedenen Varianten, die sich dadurch unterscheiden,
+aus welcher Quelle sie die Bitmap-Daten laden. In einer Java-<i>Applikation</i>
+wird in der Regel die Methode <a href="index_g.html#ixb101732"><font color=#000080><tt>getImage</tt></font></a>
+aus der Klasse <a href="index_t.html#ixb100506"><font color=#000080><tt>Toolkit</tt></font></a>
+verwendet. Sie erwartet den Namen einer lokalen Datei als Parameter:
+<p>
+<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#EEFFCC">
+<tr>
+<td valign=top width=100%>
+<font color="#660066">
+<pre>
+public Image getImage(String filename)
+</pre>
+</font>
+</td>
+<td valign=top>
+<a href="../jdkdocs/api/java/awt/Toolkit.html" onClick="this.href=getApiDoc('java.awt.Toolkit')"><font color="#660066" size=-1>java.awt.Toolkit</font></a></td>
+</tr>
+</table>
+
+<p>
+<a href="index_g.html#ixb101732"><font color=#000080><tt>getImage</tt></font></a>
+versteht in der aktuellen Version des AWT die beiden Bitmap-Typen
+<a name="ixa102324"><i>gif</i></a> und <a name="ixa102325"><i>jpeg</i></a>.
+<a name="ixa102326"></a> <a name="ixa102327"></a> Andere Grafikformate,
+wie etwa das unter Windows gebräuchliche <a name="ixa102328"><i>bmp</i></a>-Format,
+werden nicht unterstützt, sondern müssen bei Bedarf konvertiert
+werden.
+<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>
+Neben den <a href="index_g.html#ixb101732"><font color=#000080><tt>getImage</tt></font></a>-Methoden
+gibt es seit dem JDK 1.2 auch zwei Methoden mit dem Namen <a name="ixa102329"><a href="index_c.html#ixb100644"><font color=#000080><tt>createImage</tt></font></a></a>
+in der Klasse <a href="index_t.html#ixb100506"><font color=#000080><tt>Toolkit</tt></font></a>:
+<p>
+<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#EEFFCC">
+<tr>
+<td valign=top width=100%>
+<font color="#660066">
+<pre>
+public abstract Image createImage(String filename)
+public abstract Image createImage(URL url)
+</pre>
+</font>
+</td>
+<td valign=top>
+<a href="../jdkdocs/api/java/awt/Toolkit.html" onClick="this.href=getApiDoc('java.awt.Toolkit')"><font color="#660066" size=-1>java.awt.Toolkit</font></a></td>
+</tr>
+</table>
+
+<p>
+Sie laden ein Image bei jeder Verwendung neu und führen (im Gegensatz
+zu <a href="index_g.html#ixb101732"><font color=#000080><tt>getImage</tt></font></a>)
+kein Caching des Bildes durch. Die JDK-Dokumentation empfiehlt sie
+gegenüber <a href="index_g.html#ixb101732"><font color=#000080><tt>getImage</tt></font></a>,
+weil bei deren Verwendung Speicherlecks durch das unbegrenzte Zwischenspeichern
+der Bilddaten entstehen können.</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>
+
+<p>
+Das <a name="ixa102330"><a href="index_t.html#ixb100506"><font color=#000080><tt>Toolkit</tt></font></a></a>
+für die aktuelle Umgebung kann mit der Methode <a name="ixa102331"><a href="index_g.html#ixb101737"><font color=#000080><tt>getToolkit</tt></font></a></a>
+der Klasse <a href="index_c.html#ixb101302"><font color=#000080><tt>Component</tt></font></a>
+beschafft werden:
+<p>
+<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#EEFFCC">
+<tr>
+<td valign=top width=100%>
+<font color="#660066">
+<pre>
+public Toolkit getToolkit()
+</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>
+Der gesamte Code zum Laden einer Bitmap <font color="#660099">duke.gif</font>
+sieht daher so aus:
+<a name="listingid034001"></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>Image img;
+<font color="#555555">002 </font>img = getToolkit().getImage(<font color="#0000FF">"duke.gif"</font>);</pre>
+</font>
+</td>
+</tr>
+</table>
+<i>
+Listing 34.1: Laden einer Bitmap-Datei</i></p>
+
+<p>
+Um das <a href="index_i.html#ixb100643"><font color=#000080><tt>Image</tt></font></a>
+anzuzeigen, kann die Methode <a name="ixa102323"><a href="index_d.html#ixb101733"><font color=#000080><tt>drawImage</tt></font></a></a>
+der Klasse <a href="index_g.html#ixb101149"><font color=#000080><tt>Graphics</tt></font></a>
+aufgerufen werden:
+<p>
+<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#EEFFCC">
+<tr>
+<td valign=top width=100%>
+<font color="#660066">
+<pre>
+public boolean drawImage(
+ Image img, int x, int y, ImageObserver observer
+)
+</pre>
+</font>
+</td>
+<td valign=top>
+<a href="../jdkdocs/api/java/awt/Graphics.html" onClick="this.href=getApiDoc('java.awt.Graphics')"><font color="#660066" size=-1>java.awt.Graphics</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>
+<a href="index_d.html#ixb101733"><font color=#000080><tt>drawImage</tt></font></a>
+gibt es in unterschiedlichen Ausprägungen. Die hier vorgestellte
+Variante erwartet das anzuzeigende <a href="index_i.html#ixb100643"><font color=#000080><tt>Image</tt></font></a>-Objekt
+und die Position <font color="#000077"><tt>(x,y)</tt></font>, an der
+die linke obere Ecke der Bitmap platziert werden soll. Das zusätzlich
+angegebene Objekt <font color="#000077"><tt>observer</tt></font> dient
+zur Übergabe eines <a name="ixa102332"><a href="index_i.html#ixb101738"><font color=#000080><tt>ImageObserver</tt></font></a></a>-Objektes,
+mit dem der Ladezustand der Bitmaps überwacht werden kann. Hier
+kann der <a href="index_t.html#ixb100273"><font color=#000080><tt>this</tt></font></a>-Zeiger,
+also eine Referenz auf das Fensterobjekt, übergeben werden. Weitere
+Varianten von <a href="index_d.html#ixb101733"><font color=#000080><tt>drawImage</tt></font></a>,
+die ein Bild sogar skalieren und spiegeln können, werden in der
+API-Dokumentation beschrieben.</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 Listing ist ein einfaches Beispiel für das Laden
+und Anzeigen der Bitmap <font color="#660099">duke.gif</font>. Alle
+erforderlichen Aktionen erfolgen innerhalb von <a href="index_p.html#ixb101148"><font color=#000080><tt>paint</tt></font></a>:
+<a name="listingid034002"></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="#0000AA">public</font> <font color="#006699">void</font> paint(Graphics g)
+<font color="#555555">002 </font>{
+<font color="#555555">003 </font> Image img;
+<font color="#555555">004 </font> img = getToolkit().getImage(<font color="#0000FF">"duke.gif"</font>);
+<font color="#555555">005 </font> g.drawImage(img,40,40,<font color="#006699">this</font>);
+<font color="#555555">006 </font>}</pre>
+</font>
+</td>
+</tr>
+</table>
+<i>
+Listing 34.2: Laden und Anzeigen einer Bitmap</i></p>
+
+<p>
+Die Ausgabe des Programms ist:
+<p>
+<a name="imageid034001"></a>
+<img src="images/Bitmap.gif">
+<p>
+
+<p><i>
+Abbildung 34.1: Laden und Anzeigen einer Bitmap</i></p>
+<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 gewählte Vorgehensweise ist nicht besonders effizient, denn
+die Bitmap wird bei jedem Aufruf von <a href="index_p.html#ixb101148"><font color=#000080><tt>paint</tt></font></a>
+neu geladen. Besser ist es, die benötigten Bitmaps einmal zu
+laden und dann im Speicher zu halten. Obwohl man vermuten könnte,
+dass dies die Ladezeit des Fensters unannehmbar verlängern würde,
+ist der Konstruktor der Klasse eine gute Stelle dafür. Der Aufruf
+von <a href="index_g.html#ixb101732"><font color=#000080><tt>getImage</tt></font></a>
+lädt die Bitmap nämlich noch nicht, sondern bereitet das
+Laden nur vor. Der eigentliche Ladevorgang erfolgt erst, wenn die
+Bitmap beim Aufruf von <a href="index_d.html#ixb101733"><font color=#000080><tt>drawImage</tt></font></a>
+tatsächlich benötigt 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>
+
+
+<!-- Section -->
+<a name="sectlevel4id034001001001"></a>
+<h4>Die Klasse MediaTracker </h4>
+
+<p>
+Manchmal kann es sinnvoll sein, den tatsächlichen Ladevorgang
+des Bildes abzuwarten, bevor im Programm fortgefahren wird. Wird zum
+Beispiel die Größe der Bitmap benötigt, um sie korrekt
+auf dem Bildschirm anordnen oder skalieren zu können, muss das
+Programm warten, bis das <a href="index_i.html#ixb100643"><font color=#000080><tt>Image</tt></font></a>
+vollständig erzeugt ist.
+
+<p>
+Für diese Zwecke steht die Klasse <a name="ixa102333"><a href="index_m.html#ixb101739"><font color=#000080><tt>MediaTracker</tt></font></a></a>
+zur Verfügung, die das Laden eines oder mehrerer Bilder überwacht.
+Dazu wird zunächst eine Instanz der Klasse angelegt:
+<p>
+<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#EEFFCC">
+<tr>
+<td valign=top width=100%>
+<font color="#660066">
+<pre>
+public MediaTracker(Component comp)
+</pre>
+</font>
+</td>
+<td valign=top>
+<a href="../jdkdocs/api/java/awt/MediaTracker.html" onClick="this.href=getApiDoc('java.awt.MediaTracker')"><font color="#660066" size=-1>java.awt.MediaTracker</font></a></td>
+</tr>
+</table>
+
+<p>
+Als Komponente wird der <a href="index_t.html#ixb100273"><font color=#000080><tt>this</tt></font></a>-Zeiger
+des aktuellen Fensters übergeben. Anschließend werden durch
+Aufruf von <a name="ixa102334"><a href="index_a.html#ixb101740"><font color=#000080><tt>addImage</tt></font></a></a>
+alle Bilder, deren Ladevorgang überwacht werden soll, an den
+<a href="index_m.html#ixb101739"><font color=#000080><tt>MediaTracker</tt></font></a>
+übergeben:
+<p>
+<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#EEFFCC">
+<tr>
+<td valign=top width=100%>
+<font color="#660066">
+<pre>
+public void addImage(Image img, int id)
+</pre>
+</font>
+</td>
+<td valign=top>
+<a href="../jdkdocs/api/java/awt/MediaTracker.html" onClick="this.href=getApiDoc('java.awt.MediaTracker')"><font color="#660066" size=-1>java.awt.MediaTracker</font></a></td>
+</tr>
+</table>
+
+<p>
+Der zusätzlich übergebene Parameter <font color="#000077"><tt>id</tt></font>
+kann dazu verwendet werden, einen Namen zu vergeben, unter dem auf
+das <a href="index_i.html#ixb100643"><font color=#000080><tt>Image</tt></font></a>
+zugegriffen werden kann. Zusätzlich bestimmt er die Reihenfolge,
+in der die Images geladen werden. Bitmaps mit kleineren Werten werden
+zuerst geladen.
+
+<p>
+Der <a href="index_m.html#ixb101739"><font color=#000080><tt>MediaTracker</tt></font></a>
+bietet eine Reihe von Methoden, um den Ladezustand der Bilder zu überwachen.
+Wir wollen hier nur die Methode <a name="ixa102335"><a href="index_w.html#ixb101741"><font color=#000080><tt>waitForAll</tt></font></a></a>
+betrachten. Sie wartet, bis alle Images vollständig geladen sind:
+<p>
+<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#EEFFCC">
+<tr>
+<td valign=top width=100%>
+<font color="#660066">
+<pre>
+public void waitForAll()
+ throws InterruptedException
+</pre>
+</font>
+</td>
+<td valign=top>
+<a href="../jdkdocs/api/java/awt/MediaTracker.html" onClick="this.href=getApiDoc('java.awt.MediaTracker')"><font color="#660066" size=-1>java.awt.MediaTracker</font></a></td>
+</tr>
+</table>
+
+<p>
+Nach Abschluss des Ladevorgangs sendet <a href="index_w.html#ixb101741"><font color=#000080><tt>waitForAll</tt></font></a>
+eine Ausnahme des Typs <a name="ixa102336"><a href="index_i.html#ixb100628"><font color=#000080><tt>InterruptedException</tt></font></a></a>.
+
+<p>
+Das vollständige Beispielprogramm zur Anzeige von <font color="#660099">duke.gif</font>
+sieht nun so aus:
+<a name="listingid034003"></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">/* Listing3403.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> Listing3403
+<font color="#555555">007 </font><font color="#0000AA">extends</font> Frame
+<font color="#555555">008 </font>{
+<font color="#555555">009 </font> <font color="#0000AA">private</font> Image img;
+<font color="#555555">010 </font>
+<font color="#555555">011 </font> <font color="#0000AA">public</font> <font color="#0000AA">static</font> <font color="#006699">void</font> main(String[] args)
+<font color="#555555">012 </font> {
+<font color="#555555">013 </font> Listing3403 wnd = <font color="#0000AA">new</font> Listing3403();
+<font color="#555555">014 </font> }
+<font color="#555555">015 </font>
+<font color="#555555">016 </font> <font color="#0000AA">public</font> Listing3403()
+<font color="#555555">017 </font> {
+<font color="#555555">018 </font> <font color="#006699">super</font>(<font color="#0000FF">"Bitmap"</font>);
+<font color="#555555">019 </font> setBackground(Color.lightGray);
+<font color="#555555">020 </font> setSize(250,150);
+<font color="#555555">021 </font> setVisible(<font color="#006699">true</font>);
+<font color="#555555">022 </font> <font color="#00AA00">//WindowListener</font>
+<font color="#555555">023 </font> addWindowListener(<font color="#0000AA">new</font> WindowClosingAdapter(<font color="#006699">true</font>));
+<font color="#555555">024 </font> <font color="#00AA00">//Bild laden</font>
+<font color="#555555">025 </font> img = getToolkit().getImage(<font color="#0000FF">"duke.gif"</font>);
+<font color="#555555">026 </font> MediaTracker mt = <font color="#0000AA">new</font> MediaTracker(<font color="#006699">this</font>);
+<font color="#555555">027 </font> mt.addImage(img, 0);
+<font color="#555555">028 </font> <font color="#0000AA">try</font> {
+<font color="#555555">029 </font> <font color="#00AA00">//Warten, bis das Image vollständig geladen ist,</font>
+<font color="#555555">030 </font> mt.waitForAll();
+<font color="#555555">031 </font> } <font color="#0000AA">catch</font> (InterruptedException e) {
+<font color="#555555">032 </font> <font color="#00AA00">//nothing</font>
+<font color="#555555">033 </font> }
+<font color="#555555">034 </font> repaint();
+<font color="#555555">035 </font> }
+<font color="#555555">036 </font>
+<font color="#555555">037 </font> <font color="#0000AA">public</font> <font color="#006699">void</font> paint(Graphics g)
+<font color="#555555">038 </font> {
+<font color="#555555">039 </font> <font color="#0000AA">if</font> (img != <font color="#006699">null</font>) {
+<font color="#555555">040 </font> g.drawImage(img,40,40,<font color="#006699">this</font>);
+<font color="#555555">041 </font> }
+<font color="#555555">042 </font> }
+<font color="#555555">043 </font>}</pre>
+</font>
+</td>
+<td valign=top align=right>
+<a href="../examples/Listing3403.java"><font color="#000055" size=-1>Listing3403.java</font></a></td>
+</tr>
+</table>
+<i>
+Listing 34.3: Programm zum Laden und Anzeigen einer Bitmap</i></p>
+
+
+<!-- Section -->
+<a name="entwicklungbitmapkomponente"></a>
+<h3>34.1.2 Entwicklung einer eigenen Bitmap-Komponente </h3>
+
+<p>
+Ein schönes Beispiel für die Verwendung von Bitmaps ist
+die Konstruktion einer Komponente <a name="ixa102337"><a href="index_b.html#ixb101742"><font color=#000080><tt>BitmapComponent</tt></font></a></a>,
+die in Dialogboxen zur Anzeige von Bitmaps verwendet werden kann.
+Die Verwendung soll dabei so einfach wie möglich sein, d.h. außer
+der Übergabe des Dateinamens an den Konstruktor soll kein zusätzlicher
+Aufwand entstehen.
+
+<p>
+Zur Konstruktion der Komponente gehen wir in folgenden Schritten vor:
+<ul>
+<li>Ableiten einer neuen Klasse <a href="index_b.html#ixb101742"><font color=#000080><tt>BitmapComponent</tt></font></a>
+aus <a name="ixa102338"><a href="index_c.html#ixb101712"><font color=#000080><tt>Canvas</tt></font></a></a>.
+<li>Überlagern des Konstruktors, um dort die Bitmap zu laden.
+<li>Überlagern von <a href="index_p.html#ixb101148"><font color=#000080><tt>paint</tt></font></a>,
+um das Image auf dem Bildschirm auszugeben.
+<li>Überlagern von <a href="index_g.html#ixb101706"><font color=#000080><tt>getPreferredSize</tt></font></a>
+und <a href="index_g.html#ixb101715"><font color=#000080><tt>getMinimumSize</tt></font></a>,
+um dem Layoutmanager die Größe der Komponente mitzuteilen.
+</ul>
+
+<p>
+Nach diesen Ausführungen ist die Implementierung einfach:
+<a name="listingid034004"></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">/* BitmapComponent.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="#555555">005 </font><font color="#0000AA">class</font> BitmapComponent
+<font color="#555555">006 </font><font color="#0000AA">extends</font> Canvas
+<font color="#555555">007 </font>{
+<font color="#555555">008 </font> <font color="#0000AA">private</font> Image img;
+<font color="#555555">009 </font>
+<font color="#555555">010 </font> <font color="#0000AA">public</font> BitmapComponent(String fname)
+<font color="#555555">011 </font> {
+<font color="#555555">012 </font> img = getToolkit().getImage(fname);
+<font color="#555555">013 </font> MediaTracker mt = <font color="#0000AA">new</font> MediaTracker(<font color="#006699">this</font>);
+<font color="#555555">014 </font>
+<font color="#555555">015 </font> mt.addImage(img, 0);
+<font color="#555555">016 </font> <font color="#0000AA">try</font> {
+<font color="#555555">017 </font> <font color="#00AA00">//Warten, bis das Image vollständig geladen ist,</font>
+<font color="#555555">018 </font> <font color="#00AA00">//damit getWidth() und getHeight() funktionieren</font>
+<font color="#555555">019 </font> mt.waitForAll();
+<font color="#555555">020 </font> } <font color="#0000AA">catch</font> (InterruptedException e) {
+<font color="#555555">021 </font> <font color="#00AA00">//nothing</font>
+<font color="#555555">022 </font> }
+<font color="#555555">023 </font> }
+<font color="#555555">024 </font>
+<font color="#555555">025 </font> <font color="#0000AA">public</font> <font color="#006699">void</font> paint(Graphics g)
+<font color="#555555">026 </font> {
+<font color="#555555">027 </font> g.drawImage(img,1,1,<font color="#006699">this</font>);
+<font color="#555555">028 </font> }
+<font color="#555555">029 </font>
+<font color="#555555">030 </font> <font color="#0000AA">public</font> Dimension getPreferredSize()
+<font color="#555555">031 </font> {
+<font color="#555555">032 </font> <font color="#0000AA">return</font> <font color="#0000AA">new</font> Dimension(
+<font color="#555555">033 </font> img.getWidth(<font color="#006699">this</font>),
+<font color="#555555">034 </font> img.getHeight(<font color="#006699">this</font>)
+<font color="#555555">035 </font> );
+<font color="#555555">036 </font> }
+<font color="#555555">037 </font>
+<font color="#555555">038 </font> <font color="#0000AA">public</font> Dimension getMinimumSize()
+<font color="#555555">039 </font> {
+<font color="#555555">040 </font> <font color="#0000AA">return</font> <font color="#0000AA">new</font> Dimension(
+<font color="#555555">041 </font> img.getWidth(<font color="#006699">this</font>),
+<font color="#555555">042 </font> img.getHeight(<font color="#006699">this</font>)
+<font color="#555555">043 </font> );
+<font color="#555555">044 </font> }
+<font color="#555555">045 </font>}</pre>
+</font>
+</td>
+<td valign=top align=right>
+<a href="../examples/BitmapComponent.java"><font color="#000055" size=-1>BitmapComponent.java</font></a></td>
+</tr>
+</table>
+<i>
+Listing 34.4: Eine Komponente zum Anzeigen einer Bitmap</i></p>
+<p>
+<table border=0 cellspacing=0 cellpadding=0 width=100%>
+<tr>
+<td width=1 align=left valign=top bgcolor="#CC0000"><img src="trp1_1.gif"></td>
+<td><img src="trp1_1.gif" width=1></td>
+<td width=1 align=left valign=top bgcolor="#CC0000"><img src="trp1_1.gif"></td>
+<td><img src="trp1_1.gif" width=2></td>
+<td valign=top width=1000>
+
+<p>
+Bei diesem Beispiel ist die Verwendung des <font color="#000077"><tt>MediaTrackers</tt></font>
+obligatorisch. Andernfalls könnte es passieren, dass zum Zeitpunkt
+des Aufrufs von <a href="index_g.html#ixb101706"><font color=#000080><tt>getPreferredSize</tt></font></a>
+oder <a href="index_g.html#ixb101715"><font color=#000080><tt>getMinimumSize</tt></font></a>
+die Bitmap noch nicht geladen ist und die Methoden <a name="ixa102339"><a href="index_g.html#ixb101317"><font color=#000080><tt>getWidth</tt></font></a></a>
+und <a name="ixa102340"><a href="index_g.html#ixb101240"><font color=#000080><tt>getHeight</tt></font></a></a>
+0 zurückgeben. Dies würde dann dazu führen, dass der
+Layoutmanager den benötigten Platz fehlerhaft berechnet und die
+Komponente falsch oder gar nicht angezeigt wird.</td>
+<td><img src="trp1_1.gif" width=2></td>
+<td valign=top>
+<table border=0 cellspacing=0 cellpadding=1 width=100% bgcolor="#CC0000">
+<tr>
+<td><font color="#FFFFFF"> Warnung </font></td>
+</tr>
+</table>
+</td>
+<td width=1 align=left valign=top bgcolor="#CC0000"><img src="trp1_1.gif"></td>
+</tr>
+</table>
+
+<p>
+Die Einbindung von <a href="index_b.html#ixb101742"><font color=#000080><tt>BitmapComponent</tt></font></a>
+in einen Dialog erfolgt analog zur Einbindung jeder anderen Komponente
+durch Aufruf der Methode <a href="index_a.html#ixb100727"><font color=#000080><tt>add</tt></font></a>
+der Klasse <a href="index_c.html#ixb101302"><font color=#000080><tt>Component</tt></font></a>.
+Das folgende Listing gibt ein Beispiel für die Einbindung der
+neuen Komponente:
+<a name="listingid034005"></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">/* Listing3405.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> Listing3405
+<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> Listing3405 wnd = <font color="#0000AA">new</font> Listing3405();
+<font color="#555555">012 </font> }
+<font color="#555555">013 </font>
+<font color="#555555">014 </font> <font color="#0000AA">public</font> Listing3405()
+<font color="#555555">015 </font> {
+<font color="#555555">016 </font> <font color="#006699">super</font>(<font color="#0000FF">"Bitmap-Komponente"</font>);
+<font color="#555555">017 </font> setBackground(Color.lightGray);
+<font color="#555555">018 </font> setSize(250,150);
+<font color="#555555">019 </font> setVisible(<font color="#006699">true</font>);
+<font color="#555555">020 </font> <font color="#00AA00">//Hinzufügen der Komponenten</font>
+<font color="#555555">021 </font> setLayout(<font color="#0000AA">new</font> GridLayout(2,2));
+<font color="#555555">022 </font> add(<font color="#0000AA">new</font> BitmapComponent(<font color="#0000FF">"duke.gif"</font>));
+<font color="#555555">023 </font> add(<font color="#0000AA">new</font> BitmapComponent(<font color="#0000FF">"duke.gif"</font>));
+<font color="#555555">024 </font> add(<font color="#0000AA">new</font> BitmapComponent(<font color="#0000FF">"duke.gif"</font>));
+<font color="#555555">025 </font> add(<font color="#0000AA">new</font> BitmapComponent(<font color="#0000FF">"duke.gif"</font>));
+<font color="#555555">026 </font> pack();
+<font color="#555555">027 </font> <font color="#00AA00">//WindowListener</font>
+<font color="#555555">028 </font> addWindowListener(<font color="#0000AA">new</font> WindowClosingAdapter(<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/Listing3405.java"><font color="#000055" size=-1>Listing3405.java</font></a></td>
+</tr>
+</table>
+<i>
+Listing 34.5: Verwenden der Bitmap-Komponente</i></p>
+
+<p>
+Die Ausgabe des Programms ist:
+<p>
+<a name="imageid034002"></a>
+<img src="images/BitmapComponent.gif">
+<p>
+
+<p><i>
+Abbildung 34.2: Verwendung von BitmapComponent</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"> 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="k100224.html"> << </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="k100224.html"> < </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="k100226.html"> > </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="k100228.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>
|
