<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Echofalko's Heimverzeichnis</title>
	<atom:link href="http://echofalko.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://echofalko.wordpress.com</link>
	<description>This wasn't supposed to be life</description>
	<lastBuildDate>Mon, 07 Dec 2009 16:04:35 +0000</lastBuildDate>
	<language>de</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='echofalko.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://1.gravatar.com/blavatar/166b45bbae1f6bbe0eaccdb617069658?s=96&#038;d=http%3A%2F%2Fs2.wp.com%2Fi%2Fbuttonw-com.png</url>
		<title>Echofalko's Heimverzeichnis</title>
		<link>http://echofalko.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://echofalko.wordpress.com/osd.xml" title="Echofalko&#039;s Heimverzeichnis" />
	<atom:link rel='hub' href='http://echofalko.wordpress.com/?pushpress=hub'/>
		<item>
		<title>Java, Teil 2 &#8211; Grafische Programmierung mit Swing</title>
		<link>http://echofalko.wordpress.com/2009/12/07/java-teil-2-grafische-programmierung-mit-swing/</link>
		<comments>http://echofalko.wordpress.com/2009/12/07/java-teil-2-grafische-programmierung-mit-swing/#comments</comments>
		<pubDate>Mon, 07 Dec 2009 16:04:35 +0000</pubDate>
		<dc:creator>echofalko</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://echofalko.wordpress.com/?p=55</guid>
		<description><![CDATA[Dieser Artikel soll über die Möglichkeiten der Entwicklung grafischer Anwendungen mit der Swing-Bibliothek [1] informieren, Anfängern eine Starthilfe geben und Kenner zumindest mit Hintergrundinformationen versorgen. Redaktioneller Hinweis: Es empfiehlt sich, den ersten Teil dieses Artikels („Java, Teil 1 &#8211; Einführung in eine moderne Sprache“, freiesMagazin 10/2009 [2]) nachzulesen, falls die Grundlagen von Java noch nicht verinnerlicht sind. [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=echofalko.wordpress.com&amp;blog=4079735&amp;post=55&amp;subd=echofalko&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><strong>D</strong><strong>ieser Artikel soll über die Möglichkeiten der Entwicklung  grafischer Anwendungen mit der Swing-Bibliothek <a href="http://de.wikipedia.org/wiki/Swing_%28Java%29">[1]</a> informieren, Anfängern eine Starthilfe geben und Kenner zumindest mit Hintergrundinformationen versorgen.</strong></p>
<div></div>
<p><strong>Redaktioneller Hinweis:</strong> <em>Es empfiehlt sich, den ersten Teil dieses Artikels („Java, Teil 1 &#8211; Einführung in eine moderne Sprache“, <strong><span style="color:#595959;">freies</span></strong><span style="color:#ff630a;">Magazin</span> 10/2009 <a href="http://www.freiesmagazin.de/freiesMagazin-2009-10">[2]</a>) nachzulesen, falls die Grundlagen von Java noch nicht verinnerlicht sind.</em></p>
<div></div>
<h2>Swing &#8211; Was ist das?</h2>
<div></div>
<p>Bei Swing handelt es sich um eine vorprogrammierte Klassenbibliothek,  mit deren Hilfe grafische Anwendungen unter Java entwickelt werden  können. Es ist also nicht erforderlich zu definieren, was ein  Fenster oder was ein Textfeld ist und wie sich solche Elemente  verhalten können. Sie werden einfach „benutzt“, in dem ein Objekt  erzeugt wird, das beispielsweise vom Typ „Fenster“ ist. Ungeduldige  können sich bei Sun direkt die vielen vordefinierten Elemente  ansehen <a href="http://java.sun.com/docs/books/tutorial/ui/features/components.html">[3]</a>.</p>
<div></div>
<h2>Vorbereitung</h2>
<div></div>
<p>Es sollte auf eine Entwicklungsumgebung zurückgegriffen werden, um  die Vorzüge der automatischen Vervollständigung und der Syntaxprüfung zu genießen. So lassen sich Tippfehler sehr  leicht aufspüren. Wie im ersten Teil bereits erläutert, bieten sich  für die in diesem Artikel beschriebenen Zwecke besonders Netbeans  und Eclipse an, die beide frei und gleichberechtigt sind.</p>
<div></div>
<p>In diesem Artikel wird aber die Einrichtung von Eclipse beschrieben.  Bei vielen Distributionen kann das Paket <strong>eclipse</strong> installiert  werden oder direkt die binären Dateien der aktuellen Version von  der Homepage <a href="http://www.eclipse.org/">[4]</a> heruntergeladen werden.</p>
<p><a href="http://echofalko.files.wordpress.com/2009/12/swing-eclipse.png"><img class="aligncenter size-full wp-image-62" title="swing-eclipse" src="http://echofalko.files.wordpress.com/2009/12/swing-eclipse.png?w=450&#038;h=312" alt="Eclipse in Action" width="450" height="312" /></a></p>
<p>Es  handelt sich um einen Ordner, in dem die Startdatei direkt  ausführbar ist. Dieser wird dann zum Beispiel mit root-Rechten in  das Verzeichnis <strong><tt>/opt</tt></strong> verschoben. Einen Starter im Menü muss man dann allerdings manuell angelegen. Beim ersten Starten erscheint die  Aufforderung, einen Workspace anzulegen. Das ist das Verzeichnis,  in dem alle relevanten Dateien der Projekte       abgelegt werden.</p>
<div></div>
<p>Sollte sich in diesem Fenster bereits Eclipse beschweren, dass  lediglich eine „gij“-Version von Java gefunden wurde, könnten  Fehler auftreten, da diese Version nicht offiziell von Eclipse  unterstützt wird. Keine Probleme treten auf,  wenn das offizielle <strong>sun-java6-jdk</strong> und die <strong>sun-java6-jre</strong> installiert sind. Eine „openjdk“-Variante tut es aber auch, falls  großer Wert auf freie Lizenzen gelegt wird. Mit dem Befehl</p>
<div></div>
<table style="height:48px;" width="111">
<tbody>
<tr>
<td align="left">
<div>
<pre>$ java -version
</pre>
</div>
</td>
</tr>
</tbody>
</table>
<div></div>
<p>kann geprüft werden, ob die Installation geglückt ist und auch  erkannt wird. Sollte nicht die gewünschte Ausgabe erscheinen, kann  es sein, dass mehrere Compiler und Laufzeitumgebungen parallel  installiert sind. Da hilft meist die manuelle Einstellung durch den  Befehl</p>
<div></div>
<table>
<tbody>
<tr>
<td align="left">
<div>
<pre># update-alternatives --config java
</pre>
</div>
</td>
</tr>
</tbody>
</table>
<div></div>
<p>sofern das Alternativensystem <a href="http://wiki.ubuntuusers.de/Alternativen-System">[5]</a> unter der benutzten Distribution verfügbar ist.</p>
<div></div>
<p>Nach Bestätigung des Pfades zum Workspace öffnet sich ein Begrüßungsbildschirm. Ist dieser oben rechts weggeklickt, öffnet sich zum ersten Mal die Java-Ansicht und die Programmierung kann beginnen. Es ist wichtig,  die Dateien im       Workspace nie  direkt zu manipulieren, sondern nur über Eclipse. Ansonsten stimmen die Metadaten nicht mehr, und der Workspace kann zerstört werden.</p>
<div></div>
<h2>Die Programmierung mit Swing</h2>
<div></div>
<p>Zunächst muss ein neues Projekt erstellt werden. Dies gelingt unter         „<em>File » New » Java Project</em>“. Nun wird dem Projekt noch ein Name gegeben (z. B. „SwingApp“) und gegebenenfalls die JRE   eingestellt, zum Beispiel auf <strong><tt>java-6-sun-1.6.0.16</tt></strong> oder welche JRE  auch immer installiert ist. Der nächste Dialog kann ohne Änderungen  bestätigt werden. Jetzt wird dem Projekt eine Klasse hinzugefügt,  indem mit rechts auf das Projekt geklickt und „<em>New » Class</em>“  auswählt wird. Die Klasse wird in diesem Beispiel <strong><tt>View</tt></strong> gegannt, da sie  eine grafische Oberfläche bereitstellen soll. <strong>Achtung:</strong> Klassennamen  beginnen immer mit einem Großbuchstaben.</p>
<div></div>
<p>Wie werden nun Fenster mit Java erzeugt? Zunächst muss eine Instanz  von <strong><tt>JFrame</tt></strong> erzeugt werden, welche das Hauptfenster darstellt.  <strong><tt>JFrame</tt></strong> ist die gängigste Klasse, um ein Fenster mit Java zu  erzeugen. Es werden bereits Grundfunktionen wie Fensterdekorationen  bereitgestellt, ohne dies explizit zu programmieren. Bei Betrachtung  des Quellcodes sollten alle Befehle problemlos nachvollziehbar sein:</p>
<div></div>
<table>
<tbody>
<tr>
<td align="left">
<div>
<pre>public class View extends JFrame {
   View() {
       setSize(300, 300);
       setTitle("Minimal JFrame");
       setDefaultCloseOperation(EXIT_ON_CLOSE);
       setLocationRelativeTo(null);
       setVisible(true);
    }
}
</pre>
</div>
</td>
</tr>
</tbody>
</table>
<div></div>
<p><strong><tt>View</tt></strong> ist also direkt von <strong><tt>JFrame</tt></strong> abgeleitet. Das bedeutet, dass  jede Instanz der Klasse <strong><tt>View</tt></strong> auch eine Instanz der Klasse  <strong><tt>JFrame</tt></strong> ist. Im Konstruktor kann deshalb nun direkt die Größe und  der Titel des Fensters festlegt werden, da die Klasse diese  Variablen und Methoden von <strong><tt>JFrame</tt></strong> geerbt hat. Des Weiteren wird  bestimmt, dass die Anwendung ordnungsgemäß beendet wird, sobald das  Fenster geschlossen wird &#8211; ansonsten würde die Anwendung für immer  als Hintergrundprozess weiterlaufen. Letztlich wird der Ort des  Fensters in die Mitte des Bildschirms und das Fenster sichtbar  gesetzt.</p>
<p><a href="http://echofalko.files.wordpress.com/2009/12/swing-netbeans.png"><img class="aligncenter size-full wp-image-57" title="swing-netbeans" src="http://echofalko.files.wordpress.com/2009/12/swing-netbeans.png?w=450" alt="Netbeans in Action"   /></a></p>
<div></div>
<p>Wenn der obige Quelltext einfach eingefügt wird, wird sich Eclipse  beschweren, da die Klasse <strong><tt>JFrame</tt></strong> und deren Eigenschaften nicht  bekannt sind. Durch Bewegung des Cursors hinter das Wort <strong><tt>JFrame</tt></strong> und Druck von <em>„Strg“</em> + <em>„Space“</em> wird die Umgebung angewiesen,  automatisch den passenden Import hinzuzufügen. Sollte dies aus  irgendwelchen Gründen nicht funktionieren, können für das Beispiel  einfach</p>
<div></div>
<table>
<tbody>
<tr>
<td align="left">
<div>
<pre>import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
</pre>
</div>
</td>
</tr>
</tbody>
</table>
<div></div>
<p>oben in die <strong><tt>View</tt></strong> Klasse als erste Zeilen eingefügt werden.</p>
<div></div>
<p>Die Klasse ist für sich allein nicht ausführbar, da sie keinen  Einstiegspunkt hat, welcher immer die <strong><tt>main</tt></strong>-Methode sein muss. Es  wird also noch eine Klasse hinzugefügt, etwa mit dem Namen <strong><tt>Start</tt></strong>.  Aus Bequemlichkeit kann dabei das Häkchen „<em>public static void main  (String[]args)</em>“ gesetzt werden und dieser Methodenkopf muss nicht  mehr von Hand eingetippt werden. Die Klasse <strong><tt>Start</tt></strong> soll nichts  anderes tun, als eine Instanz der Klasse <strong><tt>View</tt></strong> ohne Parameter zu  erzeugen:</p>
<div></div>
<table>
<tbody>
<tr>
<td align="left">
<div>
<pre>public class Start {
    public static void main(String[] args) {
        View myView = new View();
    }
}
</pre>
</div>
</td>
</tr>
</tbody>
</table>
<div></div>
<p>Das Programm wird nun gestartet, indem die Klasse <strong><tt>Start</tt></strong> markiert  und <em>„Strg“</em> + <em>„F11“</em> gedrückt wird. Es erscheint ein leeres Fenster mit  der Größe 300&#215;300 Pixel. In diesem könnten nun direkt weitere  Elemente &#8211; dies ist erst seit neueren Versionen möglich &#8211; oder neue  Container platziert werden, die wiederum atomare Elemente  aufnehmen können. Als atomar werden Komponenten bezeichnet, die  keine anderen Komponenten enthalten können, wie zum Beispiel  Buttons, Beschriftungen oder Rahmen.</p>
<div></div>
<p>An dieser Stelle wird auf den Stolperstein Layout-Management  hingewiesen. Dabei sind frustrierende Erlebnisse bei Einsteigern  leider an der Tagesordnung. Würde im Beispiel einfach ein Button  hinzugefügt werden, so würde er das gesamte Fenster füllen. Würde  die manuelle Größenangabe des Frames weggelassen werden, wäre das  Fenster trotz des Buttons 0px groß. Doch gibt es reichlich  Möglichkeiten, die Elemente ansehnlich automatisch anordnen zu  lassen. Sollten die vorgegebenen Layouts nicht genutzt werden, kann  jedes Element pixelgenau positioniert werden. Es muss zunächst das  Layout des Fensters auf <strong><tt>null</tt></strong> gesetzt werden (<strong><tt>null</tt></strong> ist in diesem  Zusammenhang ein Schlüsselwort, kein numerischer Wert). Nun wird  als erstes atomares      Element ein Button erzeugt und bestimmt, an  welcher Position er gezeichnet werden und wie groß er sein soll.  Schließlich wird er dem Fenster hinzugefügt. Es werden folgende Zeilen  im Konstruktor der <strong><tt>View</tt></strong>-Klasse ergänzt:</p>
<div></div>
<table>
<tbody>
<tr>
<td align="left">
<div>
<pre>setLayout(null);
JButton Button=new JButton("Test");
Button.setBounds(10, 10, 80, 25);
add(Button);
</pre>
</div>
</td>
</tr>
</tbody>
</table>
<div></div>
<p>Wichtig ist, dass wirklich jedes Element absolut positioniert werden  muss, sofern das <strong><tt>null</tt></strong>-Layout verwendet wird. Das gilt aber nicht  für die Elemente in  hierarchisch untergeordneten Containern, die ihr  eigenes Layout benutzen. Container sind die wohl wichtigste  Struktur innerhalb von <strong><tt>JFrames</tt></strong>. Sie sind sozusagen Meta-Elemente,  die wiederum eigene Elemente enthalten. Dies soll nun ausprobiert  werden. Soll zum Beispiel der Name und das Passwort eines Nutzers  abgefragt und ihm die Möglichkeit gegeben werden, die Eingabe  abzuschicken oder zu löschen, werden dafür zwei beschriftete  Eingabefelder für Text benötigt. Die Textfelder für die Eingabe des Namens und Passworts  sollen mit ihrem Label (Beschriftung) nebeneinander stehen und darunter sollen die  Buttons angeordnet werden. Die Klasse könnte etwa so aussehen:</p>
<div></div>
<table>
<tbody>
<tr>
<td align="left">
<div>
<pre>public class View extends JFrame {
    View() {
        // Erzeugung der Elemente
        JLabel nameLB= new JLabel("Name:");
        JLabel passLB= new JLabel("Pass:");
        JTextField nameTf= new JTextField(5);
        JPasswordField passPF= new JPasswordField(5);
        JButton resBut= new JButton("Reset");
        JButton sendBut= new JButton("Send");
        
        // Erzeugen der Panels
        JPanel tfPanel= new JPanel();
        JPanel butPanel= new JPanel();
        
        // Hinzufuegen der Elemente zum oberen Panel
        tfPanel.add(nameLB);
        tfPanel.add(nameTf);
        tfPanel.add(passLB);
        tfPanel.add(passPF);
        
        // Hinzufuegen der Elemente zum unteren Panel
        butPanel.add(resBut);
        butPanel.add(sendBut);

        // Einstellungen des Fensters
        setSize(300, 300);
        setTitle("Minimal JFrame");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        setLayout(new BoxLayout(getContentPane(), BoxLayout.Y_AXIS));
        
        // Hinzufuegen der Panels zum Fenster 
        add(tfPanel);
        add(butPanel);
        pack();
        setVisible(true);
    }
}
</pre>
</div>
</td>
</tr>
</tbody>
</table>
<p><em>Listing: <a href="http://www.freiesmagazin.de/mobil/2009-12-listings/View.class">View.class</a></em></p>
<p><em><a href="http://echofalko.files.wordpress.com/2009/12/swing-jminimaldark.png"><img class="aligncenter size-full wp-image-59" title="swing-jminimaldark" src="http://echofalko.files.wordpress.com/2009/12/swing-jminimaldark.png?w=450" alt="Das Beispiel unter GTK"   /></a><br />
</em></p>
<div></div>
<p>Das <strong><tt>JPasswordfield</tt></strong> erlaubt die Eingabe von Text mit anonymisiertem  Feedback. Unter Windows würden Sternchen angezeigt werden, unter  GNOME Kreise, doch prinzipiell kann je nach Geschmack jedes  Feedbacksymbol festlegt werden. Der Parameter <strong><tt>5</tt></strong> bei der Erzeugung  der Textfelder gibt die Breite der Felder in Zeichen an. Als  Container wird im Beispiel <strong><tt>JPanel</tt></strong> gewählt, welcher eigene  Komponenten aufnimmt. Es wurde kein Layout für die Panels  vorgegeben, da das Standardlayout gut passt. Es wird  standardmäßig  ein <strong><tt>FlowLayout</tt></strong> verwendet, welches die Elemente von links nach  rechts, mit 5 Pixel vertikalem sowie horizontalem Puffer mittig  ausrichtet. Dem Hauptfenster wurde ein &#8211; syntaktisch leider   kompliziertes  &#8211; <strong><tt>BoxLayout</tt></strong> entlang der vertikalen Achse zugewiesen.  Das sorgt dafür, dass die beiden Panels untereinander angeordnet  werden. Die Anweisung <strong><tt>setSize(300, 300)</tt></strong> wird nun ignoriert, da  auch <strong><tt>pack()</tt></strong> auftaucht. Das bezweckt, dass das Fenster genauso  groß wird, wie es die Elemente und das Layout erfordern. Da Puffer  in den <strong><tt>FlowLayouts</tt></strong> vorhanden sind, führt dies nicht zu unschönen  Berührungen von Elementen mit dem Rand des Hauptfensters.</p>
<p><a href="http://echofalko.files.wordpress.com/2009/12/swing-jminimalhuman.png"><img class="aligncenter size-full wp-image-60" title="swing-jminimalhuman" src="http://echofalko.files.wordpress.com/2009/12/swing-jminimalhuman.png?w=450" alt="Das Beispiel unter dem Human-Thema"   /></a></p>
<div></div>
<p>Weitere interessante Layouts sind das <strong><tt>GridLayout</tt></strong> und das  <strong><tt>BorderLayout</tt></strong>. Ersteres ordnet die Elemente, wie der Name vermuten  lässt, in einer gleichmäßigen Gitterstruktur an. Letzteres kennt  fünf Positionen für seine Elemente: Norden, Osten, Süden, Westen  und Mitte. Das mag auf den ersten Blick wenig sinnvoll erscheinen.  Doch verglichen mit dem Aufbau moderner Webseiten mit Header,  linker Navigation, Inhalt, rechter Navigation und Fußzeile, lassen  sich schnell die Parallelen erkennen.</p>
<div></div>
<p>Ein Element, das gezielt eingesetzt werden sollte, ist der Rahmen.  Um einen Rahmen um ein Element oder auch um ein Panel zu zeichnen,  wird zum Beispiel geschrieben:</p>
<div></div>
<table>
<tbody>
<tr>
<td align="left">
<div>
<pre>Element.setBorder(BorderFactory.
    createEtchedBorder(EtchedBorder.RAISED));
</pre>
</div>
</td>
</tr>
</tbody>
</table>
<div></div>
<p>Es würde ein erhobener dreidimensionaler Rahmen um das Element mit  dem Namen <strong><tt>Element</tt></strong> gezeichnet werden. Dieser könnte auch noch  beschriftet werden.</p>
<div></div>
<p>Um ein Element mit einem <strong><tt>Tooltip</tt></strong> auszustatten (ein kurzer  informativer Text), wird z. B. um den Button in der <strong><tt>View</tt></strong>-Klasse damit zu erweitern, folgende Zeile eingefügt:</p>
<div></div>
<table>
<tbody>
<tr>
<td align="left">
<div>
<pre>sendBut.setToolTipText("Sendet die Daten ab");
</pre>
</div>
</td>
</tr>
</tbody>
</table>
<div></div>
<p>Schwebt nun der Mauszeiger für einige Zeit über dem Button, wird der Text  eingeblendet. Sind die wesentlichen Konzepte der Layouts  verinnerlicht und die Funktionsweise von <strong><tt>pack()</tt></strong>, <strong><tt>setSize()</tt></strong> und  <strong><tt>setLayout()</tt></strong> nachvollzogen, können ohne grafischen GUI-Builder  ansehnliche Applikationen erstellt werden, wobei diese auch nicht  verteufelt werden sollen. Tatsächlich sind bei komplexen Projekten  GUI-Builder sehr populär.</p>
<div></div>
<h2>Benutzerinteraktion</h2>
<div></div>
<p>Als Beispiel dafür, wie nun Buttons zum „Leben“ erweckt werden, wird  der Reset-Button so implementiert, dass er beide Eingabefelder  wirklich löscht. Das Ereignis des Klicks auf den Button muss  abgefangen werden. Dies erledigt ein <strong><tt>EventListener</tt></strong>. Dieser kann  als anonyme Klasse direkt in die Klasse geschrieben werden, in der der  größte Zusammenhang zur Funktionalität besteht. Fortgeschrittene  verwenden eine eigene „Controller“-Klasse, welche sich  ausschließlich um solche Funktionen kümmert. In diesem Fall wird  diese neue Klasse in die Klasse <strong><tt>View</tt></strong> geschrieben.</p>
<div></div>
<table>
<tbody>
<tr>
<td align="left">
<div>
<pre>resBut.addActionListener(new ActionListener() {
   public void actionPerformed(ActionEvent e) {
        nameTf.setText();
        passPF.setText();
     }
 });
</pre>
</div>
</td>
</tr>
</tbody>
</table>
<div></div>
<p>Damit innerhalb dieser Klasse auf die Textfelder zugegriffen werden  kann, müssen sie zuvor als <strong><tt>final</tt></strong> deklariert werden. Also  ist <strong><tt>final</tt></strong> in den beiden Zeilen zu ergänzen:</p>
<div></div>
<table>
<tbody>
<tr>
<td align="left">
<div>
<pre>final JTextField nameTf= new JTextField(5);
final JPasswordField passPF= new JPasswordField(5);
</pre>
</div>
</td>
</tr>
</tbody>
</table>
<div></div>
<p>Es wird also dem Button einen <strong><tt>ActionListener</tt></strong> hinzugefügt, der   die Methode <strong><tt>actionPerformed</tt></strong> implementiert. Dort kommt die  gewünschte Anweisung, in diesem Falle das Löschen der  Eingabefelder, hinzu.</p>
<div></div>
<div></div>
<h2>Historisches</h2>
<div></div>
<p>Um direkt die wichtigste Frage vorweg zu klären: Der Name „Swing“  war der Arbeitstitel dieser Klassenbibliothek (eine logisch  zusammengehörige Gruppe von Klassen), weil einer der Entwickler  glaubte, dass diese Musikrichtung wieder modern werden würde.</p>
<div></div>
<p>Blickt man auf die Entstehungsgeschichte der „Java Foundation Classes“  (JFC <a href="http://en.wikipedia.org/wiki/Java_Foundation_Classes">[6]</a>), zu denen Swing gehört, lässt sich eine deutliche Entwicklung  zum Positiven feststellen. Während die     ersten Versionen von Java  noch mit dem unzureichenden „Abstract Windowing Toolkit“ (AWT <a href="http://en.wikipedia.org/wiki/Abstract_Windowing_Toolkit">[7]</a>) ausgeliefert wurden, wurde aus den Fehlern gelernt und eine nahezu  vollständig neue Implementierung vorgenommen. Das AWT  brachte nur wenige GUI-Elemente mit (einzelne Teile einer grafischen Anwendung  wie Buttons, Scrollbalken oder Schieberegler), war zum Teil  unhandlich zu programmieren und nur in einem geringen Maße  plattformunabhängig, da der Programmierer auf die grafischen  Grundelemente beschränkt war, die auf jedem Betriebssystem  vorhanden waren. Somit wurde auch teilweise der Speicher des  Betriebssystems beansprucht und die Elemente sahen oftmals doch  sehr unterschiedlich auf den verschiedenen Plattformen aus. Durch  die Folgen der noch nicht ganz durchdachten Ereignisbehandlung &#8211; mit  Ereignissen sind zum Beispiel das Klicken auf einen Button oder die  Eingabe von Text gemeint &#8211; war eine saubere Strukturierung des  Quellcodes noch nicht richtig möglich.</p>
<div></div>
<p>An dieser Stelle verfolgt Swing einen radikaleren Ansatz. Die  Komponenten werden nun größtenteils von Swing selbst gezeichnet, so  dass Aufrufe an das darunter liegende Betriebssystem seltener nötig  sind. Damit steht eine Vielzahl neuer, komplexer und bereits  definierter Elemente zur Verfügung. Dadurch werden die  Applikationen noch unabhängiger von der ausführenden Plattform. Die  nun mögliche „MVC“-Architektur (Model-View-Controller <a href="http://de.wikipedia.org/wiki/Model_View_Controller">[8]</a>) macht es dem Entwickler heute leichter, den Code, der jeweils für  die Grafikelemente, die Interaktion des Benutzers mit dem Programm  und die eigentliche Programmlogik verantwortlich ist, zu  modularisieren. Dies erhöht die Lesbarkeit und Wartbarkeit des  Codes ungemein. Elemente, die von Swing selbst gezeichnet werden,  heißen auch leichtgewichtige Komponenten und analog dazu heißen  Elemente, die z. B. durch Aufruf an den Windows-UI-Manager  gezeichnet werden, schwergewichtige Komponenten. Letztere sind auch  heute noch nötig: Insbesondere die Fenster der höchsten Ebene und  Dialoge arbeiten auf diese Weise. Heute verfügen die JFC über  sämtliche gängigen Elemente wie Auswahllisten, Buttons, Labels,  Checkboxen, Radiobuttons, sowie über komplexe Elemente wie  Dateiauswahldialoge.</p>
<div></div>
<p>Als Hauptproblem muss erwähnt werden, dass die Swing-Methoden  weitestgehend nicht threadsicher sind, sodass sich der Entwickler  selbst um Parallelitätsprobleme kümmern muss.</p>
<div></div>
<h2>Performance &#8211; Halbwahrheiten und Trugschlüsse</h2>
<div></div>
<p>Es ist wahr: Java ist nicht immer die performanteste Lösung. Die  Plattformunabhängigkeit wird durch eine relativ hungrige JVM (Java  Virtual Machine, die Schicht zwischen dem Bytecode und dem  Betriebssystem) teuer erkauft &#8211; das ist allerdings eine  grundsätzliche Frage, die bei allen derartigen Laufzeitumgebungen  eine Rolle spielt, nicht nur bei Java. Es sind die Schritte zu  bedenken, die erforderlich sind, um eine Swing-Applikation  darstellen zu können. Der Quellcode wird zunächst in einen binären  Zwischencode kompiliert. Dieser ist jetzt bereits  plattformunabhängig. Soll das Programm nun ausgeführt werden, muss  die JVM das Programm in die jeweils plattformkonforme  Maschinensprache übersetzen. Und wer jemals grafische Anwendungen  in Assembler geschrieben hat, wird sicherlich die Problematik  erkennen. Hinter vermeintlich einfachen Fensterelementen können  sich immens aufwendige Speicheroperationen verbergen.</p>
<div></div>
<h2>Look and Feel</h2>
<div></div>
<p>Eine große Stärke von Swing ist die Unterstützung sowohl nativer,  als auch freier optischer Themen. Während die Themen von  proprietären Betriebssystemen nur auf der jeweiligen Plattform zur  Verfügung stehen, gibt es auch freie Java-Themen, die auf jeder  Plattform genau gleich aussehen. Namentlich zum Beispiel das  moderne „Metal“-Theme, welches noch unterschiedliche Farbschemata  enthält, und das etwas altertümliche „Motif“-Theme. Zu den  Farbschemata sei gesagt, dass farblich ohnehin völlige Freiheit  bei nahezu allen Swing-Elementen besteht. Auf diesem Wege bieten  sich sowohl dem Entwickler als auch dem Nutzer Auswahlmöglichkeiten.</p>
<div></div>
<p>Der Entwickler kann ein bestimmtes „Look and Feel“ (L&amp;F) vorgeben,  anderenfalls kann der Nutzer das Erscheinungsbild der Anwendung  nachträglich durch Parameter im Aufruf beeinflussen. Besonders  interessant für Linux-Anwender ist das GTK-L&amp;F, welches  originalgetreu wiedergegeben wird. So lassen sich Swing-Anwendungen  unter Linux nahtlos in jedes Desktop-Thema integrieren, mitsamt  Fensterdekoration und eventuellen Hotkey-Einstellungen.</p>
<div></div>
<p>Darüber hinaus lassen sich eigene Themes erstellen und sogar eine  Kombination aus verschiedenen Themes nutzen. Möchte der Entwickler  beispielsweise eine Darstellung, die dem jeweils aktuellen  Systemthema entspricht, so wird folgende Anweisung, möglichst als  ersten Schritt, der Anwendung hinzugefügt. (Ansonsten erzeugt der  erste Konstruktoraufruf einer Swing-Komponente bereits implizit  eine Instanz der Klasse <strong><tt>ComponentUI</tt></strong> und gibt damit ein L&amp;F vor.):</p>
<div></div>
<table>
<tbody>
<tr>
<td align="left">
<div>
<pre>UIManager.setLookAndFeel(
    UIManager.getSystemLookAndFeelClassName());
</pre>
</div>
</td>
</tr>
</tbody>
</table>
<div></div>
<p>Die Anweisung kann Fehler verursachen, die behandelt werden müssen.  Für einen schnellen Test wird lediglich die Import-Anweisung  hinzugefügt, die Maus auf den rot markierten Code bewegt und auf  „<em>Surround with try/catch</em>“ geklickt.</p>
<div></div>
<p>Andersherum kann der Benutzer mit folgendem Aufruf beispielsweise  das GTK-L&amp;F erzwingen, wenn er das Programm aus der Konsole und  nicht aus einer Entwicklungsumgebung startet &#8211; falls kein anderes  explizit vorgegeben ist (<strong><tt>MyApp</tt></strong> steht im Beispiel für die  aufgerufene Klasse):</p>
<div></div>
<table>
<tbody>
<tr>
<td align="left">
<div>
<pre>$ java -Dswing.defaultlaf=com.sun.java.swing.plaf.gtk.GTKLookAndFeel MyApp
</pre>
</div>
</td>
</tr>
</tbody>
</table>
<div></div>
<p>Es sei angemerkt, dass manche Komponenten &#8211; milde gesagt &#8211; unerwartet  dargestellt werden können, wenn während des Design-Prozesses ein  anderes L&amp;F angenommen wurde. So kann zum Beispiel der Text auf  Buttons im mitgelieferten Metal-L&amp;F manchmal nicht dargestellt  werden, da die Schriftgröße zu groß für den Button wird. In diesem  Falle würde auf dem Button nur „..“ , anstatt der korrekten  Beschriftung angezeigt werden. Diese Feinheiten sollten stets  beachtet werden und die unterschiedlichen L&amp;F-Einstellungen vorher  getestet werden. Im Zweifelsfall ist es am sichersten, das  Metal-L&amp;F vorzugeben.</p>
<div></div>
<p>Eine weitere interessante Möglichkeit ist das Ändern des L&amp;F zur  Laufzeit der Anwendung. Es sollte darauf geachtet werden, dass  eventuelle Änderungen der Proportionen nicht zu unschönen freien  Flächen führen. Es sollte daher nach Änderung des L&amp;F ausgeführt werden (<strong><tt>MyFrame</tt></strong> steht für den entsprechenden <strong><tt>MyFrame.pack()</tt></strong>). Das gilt natürlich nur, wenn sich das mit  dem verwendeten Layout verträgt. Es lassen sich optische Effekte                        bis zur völligen Individualisierung des Aussehens jedes einzelnen  Elements erzielen, was zum Beispiel für Spiele sehr oft zur  Anwendung kommt.</p>
<div></div>
<h2>Design</h2>
<div></div>
<p>Jeder hat sich schon einmal über eine verwirrende, unzureichend dokumentierte  oder schlicht unzureichend funktionale GUI geärgert.  Dies sollte genug Motivation sein, es selbst besser zu  machen. GUI-Design erfordert Vorüberlegungen, gute Strukturierung  des Codes und eine Testphase. Gerade wegen den zahllosen  Möglichkeiten, die Elemente anzuordnen, muss die Übersicht bewahrt  werden und eine sinnvolle Einteilung festgelegt werden.</p>
<div></div>
<p>Zunächst muss beantwortet werden, wozu die GUI genau dienen soll.  Ist sie ein Monitor, eine Kontrollschnittstelle, eine  Desktopanwendung oder erfüllt sie gar mehrere Aufgaben?  Soll ein Desktopanwendung, die aus mehreren Elementen besteht, erstellt werden, so bietet sich die Nutzung von internen Frames an.  In einem großen Hauptfenster  können dann beliebig viele weitere  Fenster geöffnet werden, welche aber immer noch vom Hauptfenster  abhängen. Mit einer Minimierung des Hauptfensters verschwinden  also auch alle  zusätzlichen Fenster in der Taskleiste. Beispiele für derartige      Anwendungen sind Bildbearbeitungsprogramme, Texteditoren oder  Chatprogramme. Wenn eine klare Abgrenzung zwischen verschiedenen  Aufgaben einer GUI möglich ist, sollte die GUI auch unterteilt  werden. Um den Nutzer nicht mit einem Wust aus Daten und  Interaktionsmöglichkeiten zu überfrachten, können auch mehrere  Fenster erstellt werden, die jeweils bei Bedarf sichtbar geschaltet,  fokussiert oder aktiviert werden können.</p>
<p><a href="http://echofalko.files.wordpress.com/2009/12/swing-pokerhuman.png"><img class="aligncenter size-full wp-image-61" title="swing-pokerhuman" src="http://echofalko.files.wordpress.com/2009/12/swing-pokerhuman.png?w=450&#038;h=509" alt="Beispiel für die Unicode-Unterstützung" width="450" height="509" /></a></p>
<div></div>
<p>Eine andere Möglichkeit ist die Nutzung von Tabs (Karteikarten), mit  denen eine GUI in sinnvolle Bereiche unterteilt werden kann.</p>
<div></div>
<p>Soll die GUI ohnehin nicht sehr viele Komponenten enthalten, ist  es sinnvoller, lediglich Rahmen um einzelne Gruppen von Elementen  zu implementieren. In jedem Falle sollte eine intuitive  Beschriftung gewählt und die Unicode-Unterstützung  von Swing nicht zu stark missbraucht werden. Elemente, die mit  kryptischen Pfeilen, Regenschirmen, Sternen oder sonstigen Dingbats  beschriftet sind, erschließen sich dem Nutzer nicht ohne weiteres.  Zur Bedienfreundlichkeit tragen noch Tooltips bei, die nahezu für  jede Komponente implementiert werden können.</p>
<div></div>
<h2>Schlusswort</h2>
<div></div>
<p>Mit den JFC steht unter Java eine mächtige Bibliothek zur  Entwicklung von grafischen Anwendungen bereit. In einigen Bereichen  zeigen sich jedoch Schwächen in der Syntax. Zum Teil sind die  Konstruktionen nicht immer einheitlich und intuitiv schlicht nicht  zu erfassen. Auch kann die Performance leiden, wenn nicht die  integrierten Themes benutzt werden. An der Verbesserung der  Performance wird allerding aktuell hart gearbeitet (Stichwort:  Just-In-Time-Compiler <a href="http://en.wikipedia.org/wiki/Just-in-time_compilation">[9]</a>), sodass noch einige Verbesserungen in Aussicht sind.</p>
<div></div>
<p>Die erste Anlaufstelle für weitere Informationen ist die Tutorial-Page von Sun <a href="http://java.sun.com/docs/books/tutorial/uiswing/components/index.html">[10]</a>.</p>
<div></div>
<p><span style="color:#595959;"><span style="font-size:xx-small;">Links</span></span></p>
<ol type="1">
<li> <a href="http://de.wikipedia.org/wiki/Swing_%28Java%29"><tt>http://de.wikipedia.org/wiki/Swing_(Java)</tt></a>
<div></div>
<div></div>
</li>
<li> <a href="http://www.freiesmagazin.de/freiesMagazin-2009-10"><tt>http://www.freiesmagazin.de/freiesMagazin-2009-10</tt></a>
<div></div>
<div></div>
</li>
<li> <a href="http://java.sun.com/docs/books/tutorial/ui/features/components.html"><tt>http://java.sun.com/docs/books/tutorial/ui/features/components.html</tt></a>
<div></div>
<div></div>
</li>
<li> <a href="http://www.eclipse.org/"><tt>http://www.eclipse.org</tt></a>
<div></div>
<div></div>
</li>
<li> <a href="http://wiki.ubuntuusers.de/Alternativen-System"><tt>http://wiki.ubuntuusers.de/Alternativen-System</tt></a>
<div></div>
<div></div>
</li>
<li> <a href="http://en.wikipedia.org/wiki/Java_Foundation_Classes"><tt>http://en.wikipedia.org/wiki/Java_Foundation_Classes</tt></a>
<div></div>
<div></div>
</li>
<li> <a href="http://en.wikipedia.org/wiki/Abstract_Windowing_Toolkit"><tt>http://en.wikipedia.org/wiki/Abstract_Windowing_Toolkit</tt></a>
<div></div>
<div></div>
</li>
<li> <a href="http://de.wikipedia.org/wiki/Model_View_Controller"><tt>http://de.wikipedia.org/wiki/Model_View_Controller</tt></a>
<div></div>
<div></div>
</li>
<li> <a href="http://en.wikipedia.org/wiki/Just-in-time_compilation"><tt>http://en.wikipedia.org/wiki/Just-in-time_compilation</tt></a>
<div></div>
<div></div>
</li>
<li> <a href="http://java.sun.com/docs/books/tutorial/uiswing/components/index.html"><tt>http://java.sun.com/docs/books/tutorial/uiswing/components/index.html</tt></a>
<div></div>
<div></div>
</li>
</ol>
<div></div>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/echofalko.wordpress.com/55/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/echofalko.wordpress.com/55/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/echofalko.wordpress.com/55/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/echofalko.wordpress.com/55/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/echofalko.wordpress.com/55/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/echofalko.wordpress.com/55/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/echofalko.wordpress.com/55/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/echofalko.wordpress.com/55/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/echofalko.wordpress.com/55/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/echofalko.wordpress.com/55/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/echofalko.wordpress.com/55/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/echofalko.wordpress.com/55/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/echofalko.wordpress.com/55/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/echofalko.wordpress.com/55/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=echofalko.wordpress.com&amp;blog=4079735&amp;post=55&amp;subd=echofalko&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://echofalko.wordpress.com/2009/12/07/java-teil-2-grafische-programmierung-mit-swing/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/d956046007bf9dc22d3e498c20a959fd?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">echofalko</media:title>
		</media:content>

		<media:content url="http://echofalko.files.wordpress.com/2009/12/swing-eclipse.png" medium="image">
			<media:title type="html">swing-eclipse</media:title>
		</media:content>

		<media:content url="http://echofalko.files.wordpress.com/2009/12/swing-netbeans.png" medium="image">
			<media:title type="html">swing-netbeans</media:title>
		</media:content>

		<media:content url="http://echofalko.files.wordpress.com/2009/12/swing-jminimaldark.png" medium="image">
			<media:title type="html">swing-jminimaldark</media:title>
		</media:content>

		<media:content url="http://echofalko.files.wordpress.com/2009/12/swing-jminimalhuman.png" medium="image">
			<media:title type="html">swing-jminimalhuman</media:title>
		</media:content>

		<media:content url="http://echofalko.files.wordpress.com/2009/12/swing-pokerhuman.png" medium="image">
			<media:title type="html">swing-pokerhuman</media:title>
		</media:content>
	</item>
		<item>
		<title>Java, Teil 1 &#8211; Einführung in eine moderne Sprache</title>
		<link>http://echofalko.wordpress.com/2009/12/01/java-teil-1-einfuhrung-in-eine-moderne-sprache/</link>
		<comments>http://echofalko.wordpress.com/2009/12/01/java-teil-1-einfuhrung-in-eine-moderne-sprache/#comments</comments>
		<pubDate>Tue, 01 Dec 2009 14:08:14 +0000</pubDate>
		<dc:creator>echofalko</dc:creator>
				<category><![CDATA[Programmieren]]></category>

		<guid isPermaLink="false">http://echofalko.wordpress.com/?p=49</guid>
		<description><![CDATA[JVM, JFC, Applet, Swing &#8230; Viele Begriffe schwirren seit nunmehr 13 Jahren in den Welten der IT herum, die ihren Ursprung in der Sprache Java haben. Dieser Artikel als erster Teil einer kleinen Serie soll die Java-Welt ein wenig beleuchten und den Leser in die Lage versetzen, selbst kleine Programme in Java zu schreiben und [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=echofalko.wordpress.com&amp;blog=4079735&amp;post=49&amp;subd=echofalko&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><strong>J</strong><strong>VM, JFC, Applet, Swing &#8230; Viele Begriffe schwirren seit  nunmehr 13 Jahren in den Welten der IT herum, die ihren Ursprung in der Sprache Java haben. Dieser Artikel als erster Teil einer kleinen Serie soll die Java-Welt ein wenig beleuchten und den Leser in die  Lage versetzen, selbst kleine Programme in Java zu schreiben und Code zu lesen, ohne sich in historischen  oder technischen Einzelheiten zu verlieren.</strong></p>
<div></div>
<div></div>
<h2>Grundsätzliches</h2>
<div></div>
<p>Um ein Java-Programm lauffähig zu machen, sind drei Schritte nötig. Zuerst schreibt der Entwickler den Quellcode als java-Datei. Diese Datei kann nun durch den Compiler in eine class-Datei kompiliert werden. Es entsteht ein Bytecode, der immer noch plattformunabhängig ist. Man kann diesen Bytecode auf jeder Plattform ausführen, auf der die Java-Laufzeitumgebung (JVM &#8211; Java Virtual Machine) installiert ist. Der letzte Schritt zur Ausführung ist die Übersetzung des Bytecodes in die Befehle der jeweiligen Plattform durch die Laufzeitumgebung.</p>
<div></div>
<h2>Die Wahl des Editors</h2>
<div></div>
<p>Es ist eigentlich jeder Editor geeignet, um in Java zu programmieren. Man sollte sich aber den Komfort von Syntaxhervorhebung gönnen, um sich die Arbeit ein wenig zu erleichtern. Für GNOME eignet sich der hauseigene Editor gedit, für KDE beispielsweise Kate. Mit  zunehmender Komplexität der Programme möchte man aber auf eine ausgereifte Entwicklungsumgebung zurückgreifen.</p>
<div></div>
<p>Die wichtigsten Umgebungen zur Java-Entwicklung sind ohne Zweifel NetBeans <a href="http://www.netbeans.org/">[1]</a> und Eclipse <a href="http://www.eclipse.org/">[2]</a>. Beides sind freie Programme, die in den  gängigsten Distributionen aus den Paketquellen zu beziehen sind und jeweils ihre eigenen Vorzüge und Schwächen haben. Immer  wieder zu beobachtende „Glaubenskriege“ bezüglich der Wahl der Umgebung, die meist ergebnislos ausgefochten werden, sollten von keinem seriösen Entwickler ernst genommen werden. Der offensichtlichste Unterschied ist wohl, dass NetBeans einen grafischen GUI-Builder enthält, mit dem man per Drag &amp; Drop optisch ansprechende GUIs erstellen kann, ohne tiefgehende Kenntnisse über die Swing-Bibliothek <a href="http://de.wikipedia.org/wiki/Swing_%28Java%29">[3]</a> zu benötigen.</p>
<div></div>
<div></div>
<p>Andererseits erzeugt NetBeans mit seiner Vorlage für eine grafische Applikation bereits eine erhebliche Menge Code (300 Zeilen), welcher für Einsteiger und vielleicht sogar für Amateure sehr schwer verständlich ist. Es besteht also durchaus die Gefahr, mit dem GUI-Builder in eine Sackgasse zu laufen, wenn man den produzierten Code nicht vollständig versteht. Daher ist ein Einstieg in Swing mit dem GUI-Builder nur eingeschränkt zu empfehlen. Für Eclipse ist ein GUI-Builder bis dato nur in einem kommerziellen Zusatzpaket erhältlich. In der nächsten Ausgabe wird die Grafikprogrammierung unter Java noch ausführlich besprochen, ebenso die Vorbereitung einer Entwicklungsumgebung. In jedem Falle sind beide Umgebungen absolut ausgereift, reich an Features, leicht erweiterbar und nehmen eine absolut gleichberechtigte Stellung im Bereich der professionellen Java-Entwicklung ein.</p>
<div></div>
<h2>Installation und Vorbereitungen</h2>
<div></div>
<p>Da Sun Java <a href="http://www.java.com/de/">[4]</a> sehr verbreitet ist, werden die meisten Nutzer bereits diese Laufzeitumgebung installiert haben. Um dies zu überprüfen, fragt man die aktuell benutzte Version mitab. Die aktuellste Version von Sun Java ist „1.6.0_16“. Sollte die Versionsabfrage etwas in der Art</p>
<p>$ java -version<br />
java version &#8220;1.6.0_10&#8243;<br />
Java(TM) SE Runtime Environment (build 1.6.0_10-b33)</p>
<div></div>
<table>
<tbody>
<tr>
<td align="left">
<div>
<p>java version &#8220;1.5.0&#8243;<br />
gij (GNU libgcj) version 4.3.2</p>
</div>
</td>
</tr>
</tbody>
</table>
<div></div>
<p>ausgeben, hat man kein Sun Java, sondern ein anderes Java (hier GNU Compiler for Java <a href="http://gcc.gnu.org/java/">[5]</a>) installiert, was aber auch nicht weiter schaden sollte.</p>
<div></div>
<p>Alternativ hilft auch ein Besuch der offiziellen Sun-Testseite <a href="http://www.java.com/de/download/help/testvm.xml">[6]</a>, die aber natürlich nur ein Ergebnis liefert, wenn Java-Unterstützung im Browser eingerichtet ist.</p>
<div></div>
<p>Nun braucht man noch die notwendigen Bibliotheken, um Programme selbst kompilieren zu können. Zunächst muss man sich nun entscheiden, welche Version von Java man installieren möchte. Das Unternehmen Sun ist Urheber von Java und stellt mittlerweile  Versionen für Linux bereit, die zumindest unter der i386- und amd64-Architektur laufen. Man benötigt das JDK (Java Development Kit), welches man nicht mit der JRE (Java Runtime Environment) verwechseln darf, welche nur das Ausführen von  Java-Programmen ermöglicht. Das offizielle Java von Sun soll zukünftig unter der GPL veröffentlicht werden, sodass man diesbezüglich wohl keine Bedenken haben sollte. Man installiert das offizielle Java beispielsweise durch das  Paket <strong>sun-java6-jdk</strong>. Die bereits jetzt komplett freie Version OpenJDK lässt  sich in den gängigsten Distributionen durch das Paket <strong>openjdk-6-jdk</strong> installieren. Sollten dennoch außerordentliche Probleme auftreten, hilft Ubuntu-Nutzern die Wikiseite <a href="http://wiki.ubuntuusers.de/Java">[7]</a> in den meisten Fällen weiter.</p>
<div></div>
<h2>Das erste Programm</h2>
<div></div>
<p>Das beliebte „Hello World“ ist in Java auf den ersten Blick komplex. Es wird jedoch jeder einzelne Begriff genau erklärt, um niemandem mit Halbwissen und Vermutungen zurückzulassen.</p>
<div></div>
<table>
<tbody>
<tr>
<td align="left">
<div>
<p>class MyClass {<br />
public static void main(String[] args)<br />
{<br />
System.out.println(&#8222;Hello World&#8220;);<br />
}<br />
// Dies ist ein einzeiliger Kommentar.</p>
<p>/* Dies ist ein Blockkommentar,<br />
der ueber mehrere Zeilen geht.<br />
*/<br />
}</p>
</div>
</td>
</tr>
</tbody>
</table>
<p><em>Listing: <a href="http://www.freiesmagazin.de/mobil/2009-10-listings/MyClass.java">MyClass.java</a></em></p>
<div></div>
<p>Der Quelltext wird als Datei <strong><tt>MyClass.java</tt></strong> gespeichert. Danach bewegt man sich in der Konsole in das entsprechende Verzeichnis und kompiliert das Programm mit</p>
<div></div>
<table>
<tbody>
<tr>
<td align="left">
<div>
<p>$ javac MyClass.java</p>
</div>
</td>
</tr>
</tbody>
</table>
<div></div>
<p>Anschließend startet man das Programm mit</p>
<div></div>
<table>
<tbody>
<tr>
<td align="left">
<div>
<p>$ java MyClass</p>
</div>
</td>
</tr>
</tbody>
</table>
<div></div>
<p><strong>Hinweis:</strong> Die Endung <strong><tt>.class</tt></strong> wird nicht mit angegeben.</p>
<div></div>
<div></div>
<h3>Erklärung des Beispiels</h3>
<div></div>
<div></div>
<p>Die erste Zeile leitet die Klasse ein, den äußeren Rahmen einer Java-Anwendung. Man beachte, dass der Bezeichner der Klasse (hier <strong><tt>MyClass</tt></strong>) groß geschrieben wird.</p>
<div></div>
<p>Die zweite Zeile ist die Kopfzeile der Hauptmethode der Klasse, die immer <strong><tt>main</tt></strong> heißen muss. Eine Methode ist ein Unterprogramm. Hat sie einen Rückgabewert, spricht man von Funktionen, ansonsten auch von Prozeduren. Sie ist der Einstiegspunkt, an dem ein Programm mit der Ausführung beginnt. Die Kopfzeile der Hauptmethode muss in jedem Programm genau so aussehen. <strong><tt>public</tt></strong> besagt, dass die Methode von außerhalb der Klasse aufgerufen werden kann, <strong><tt>static</tt></strong> besagt, dass die Methode direkt aus der Klasse aufgerufen wird (ohne Objekt), <strong><tt>void</tt></strong> legt schließlich fest, dass die Methode keinen Rückgabewert hat. In den runden Klammern steht der Parameter, der dieser Methode übergeben wird.      In diesem Falle ein Array (eine Art von Liste) von Strings (Zeichenketten), auf die in der Methode unter dem Namen <strong><tt>args</tt></strong> (Argument) zugegriffen werden kann.</p>
<div></div>
<p>Nun beginnt eingeschlossen von den geschweiften Klammern der eigentliche Programmcode. Es wird die Methode <strong><tt>println</tt></strong> aufgerufen, die unter dem Pfad <strong><tt>System.out</tt></strong> erreichbar ist. Die Methode gibt eine Zeichenkette mit Zeilenumbruch auf der Konsole aus. Diese Zeichenkette wird in runden Klammern übergeben. Am Ende jeder Anweisung muss ein Semikolon stehen (auch wenn es die letzte ist).</p>
<div></div>
<p>Schließlich wird die Klasse noch  durch eine geschweifte Klammer geschlossen. Das sind zunächst eine Menge Schlüsselwörter für eine so simple Funktionalität. Doch ist gerade diese strikte Strukturierung unter Java in vielen  Situationen vorteilhaft.</p>
<div></div>
<h2>Was zeichnet Java aus?</h2>
<div></div>
<p>Wie am Beispiel erkennbar, ist Java sehr streng typisiert. Dies ist nicht zu vergleichen mit Sprachen, die auch als Skripte ausgeführt werden können wie zum Beispiel Python. Der Code wird dadurch umfangreicher. Allerdings erkennt der Compiler Fehler im Code sehr präzise und zwingt dem Entwickler einen sauberen und typsicheren Stil auf. Typsicherheit wird bei Java sehr groß geschrieben. Das bedeutet, dass zu jeder Zeit während der Laufzeit des Programms gewährleistet ist, dass eine Variable stets den richtigen Typ hat und so verwendet werden kann, wie es die Programmlogik erfordert. Es kann also nicht passieren, dass ein Programm anstandslos kompiliert, obwohl eine Zeichenkette (String) durch eine ganze Zahl (Integer) dividiert wird (was eine nicht definierte Operation wäre).</p>
<div></div>
<h2>Syntaktisches</h2>
<div></div>
<p>Die wichtigsten Syntaxregeln sind bereits im Beispiel erkennbar. Klassen, Methoden und Blöcke (logisch zusammenhängende Anweisungen) werden von geschweiften Klammern umschlossen. Jede Anweisung wird mit einem Semikolon beendet. Methoden und Variablen werden mit Angabe ihres Pfades aufgerufen. Unterverzeichnisse werden mit Punkten getrennt.</p>
<div></div>
<p>Fügt man eine weitere Klasse hinzu und legt sie im gleichen Verzeichnis ab wie die andere Klasse, sind sich die Klassen untereinander bekannt.</p>
<div></div>
<table>
<tbody>
<tr>
<td align="left">
<div>
<p>class MyClass2<br />
{<br />
static String text=&#8220;Hallo Welt&#8220;;<br />
}</p>
</div>
</td>
</tr>
</tbody>
</table>
<p><em>Listing: <a href="http://www.freiesmagazin.de/mobil/2009-10-listings/MyClass2.java">MyClass2.java</a></em></p>
<div></div>
<div></div>
<p>Diese Klasse enthält nur eine Variable, nämlich eine Zeichenkette (<strong><tt>String</tt></strong>), die <strong><tt>text</tt></strong> heißt und den Inhalt  <strong><tt>Hallo Welt</tt></strong> hat. Sie ist als <strong><tt>static</tt></strong> deklariert, damit sie eine Eigenschaft der Klasse ist, nicht von einem Objekt (dazu später mehr). Diese Klasse lässt sich kompilieren, jedoch nicht ausführen. Es fehlt die <strong><tt>main</tt></strong>-Methode. Doch die Klasse aus dem ersten Beispiel kann nun auf die Variable der zweiten Klasse zugreifen. Man ergänze die Hauptmethode  der Klasse <strong><tt>MyClass</tt></strong> durch die Anweisung</p>
<div></div>
<table>
<tbody>
<tr>
<td align="left">
<div>
<p>System.out.println(MyClass2.text);</p>
</div>
</td>
</tr>
</tbody>
</table>
<div></div>
<p>Sind beide Klassen (neu) kompiliert, wird auf der Konsole nun auch  <strong><tt>Hallo Welt</tt></strong> ausgegeben:</p>
<div></div>
<table>
<tbody>
<tr>
<td align="left">
<div>
<p>$ javac MyClass.java<br />
$ javac MyClass2.java<br />
$ java MyClass<br />
Hallo Welt</p>
</div>
</td>
</tr>
</tbody>
</table>
<div></div>
<h2>Primitive Datentypen und Mathematik</h2>
<div></div>
<p>In Java kann man sehr ähnlich wie in jeder anderen Programmiersprache mathematische Operationen durchführen. Die gängigsten Datentypen und Operationen sollen im folgendem Beispiel gezeigt werden.</p>
<div></div>
<table>
<tbody>
<tr>
<td align="left">
<div>
<p>class Beispiel {</p>
<p>public static void main(String[] args) {</p>
<p>&nbsp;</p>
<p>// Die Variable zahl1 wird deklariert.</p>
<p>int zahl1;</p>
<p>&nbsp;</p>
<p>// zahl1 wird initialisiert es wurde</p>
<p>// ihr ein Wert zugewiesen.</p>
<p>zahl1 = 7;</p>
<p>&nbsp;</p>
<p>// zahl2 wird in einer Anweisung</p>
<p>// deklariert und initialisiert.</p>
<p>int zahl2 = 3;</p>
<p>System.out.println(zahl1 + zahl2);</p>
<p>// Ausgabe: 10</p>
<p>System.out.println(zahl1 * zahl2);</p>
<p>// Ausgabe: 21</p>
<p>System.out.println(zahl1 / zahl2);</p>
<p>// Ausgabe: 2<br />
// &#8220;double&#8220; ist genauer</p>
<p>double zahl3 = 7.0;<br />
System.out.println(zahl3 / zahl2);</p>
<p>// Ausgabe: 2.33333&#8230;</p>
<p>}</p>
<p>}</p>
<pre>
</pre>
</div>
</td>
</tr>
</tbody>
</table>
<p><em>Listing: <a href="http://www.freiesmagazin.de/mobil/2009-10-listings/Beispiel.java">Beispiel.java</a></em></p>
<div></div>
<div></div>
<p>Warum wird bei der ersten Division als Ergebnis der Wert 2 ausgegeben?  In dem Beispiel wird mit ganzen Zahlen (<strong><tt>int</tt></strong>) gerechnet. Die Nachkommastellen werden einfach abgeschnitten. Wird ein genaues Ergebnis gewünscht, muss ein anderer Datentyp benutzt werden, wie zum Beispiel <strong><tt>double</tt></strong>.</p>
<div></div>
<h2>Klassen und Objekten</h2>
<div></div>
<p>Objekte können in Java für nahezu alle greifbaren Elemente des Programms stehen. Diese können simpel (eine Zahl) oder komplex (eine Liste von Hashmaps, in denen offene Datenbankverbindungen auf die jeweiligen Nutzer abgebildet werden) sein. Eine Tatsache muss allerdings beachtet werden: Primitive Datentypen sind in Java keine Objekte. Dies sind beispielsweise <strong><tt>int</tt></strong> oder <strong><tt>double</tt></strong> (später dazu mehr). Jedes Objekt hat einen bestimmten Typ. Im Beispiel <strong><tt>MyClass2</tt></strong> ist die Variable <strong><tt>text</tt></strong> ein Objekt vom Typ <strong><tt>String</tt></strong>. Somit ist sichergestellt, dass ein Objekt nur so benutzt werden kann, wie es für seinen Typ definiert ist. Ist für Objekte des Typs „Turnschuh“ beispielsweise die  Methode „volltanken“ nicht definiert, obwohl sie im Code aufgerufen wird, würde der  Compiler dies sofort erkennen.</p>
<div></div>
<p>Eine Klasse ist in Java nichts anderes als ein Bauplan für Objekte eines bestimmten Typs. Der Bezeichner der Klasse ist gleichzeitig der Bezeichner des Typs der Objekte, die  Instanzen dieser Klasse sind.</p>
<div></div>
<table>
<tbody>
<tr>
<td align="left">
<div>
<p>class Person {<br />
public String vorname;<br />
public String nachname;</p>
<p>public void printName()<br />
{<br />
System.out.println(vorname+&#8220; &#8220;+nachname);<br />
}<br />
}</p>
</div>
</td>
</tr>
</tbody>
</table>
<p><em>Listing: <a href="http://www.freiesmagazin.de/mobil/2009-10-listings/Person.java">Person.java</a></em></p>
<div></div>
<p>Es wurde ein neuer Datentyp namens <strong><tt>Person</tt></strong> erzeugt. Man beachte, dass die beiden Variablen <strong><tt>vorname</tt></strong> und <strong><tt>nachname</tt></strong> nun nicht als <strong><tt>static</tt></strong> deklariert werden. Das hat zur Folge, dass jedes Objekt vom Typ <strong><tt>Person</tt></strong> nun die beiden Variablen „hat“. Jede Person hat ihre eigenen Variablen. Somit sind die Variablen keine Eigenschaften der Klasse mehr, sondern von den Instanzen, die sie erzeugt. Die Methode <strong><tt>printName</tt></strong> ist ebenfalls nicht statisch, sie wird also nur von Objekten aufgerufen. Die runden Klammern nach dem Bezeichner sagen aus, dass die Methode keinen weiteren Parameter erwartet. Sie gibt den Vornamen, gefolgt von einem Leerzeichen (Zeichenketten werden mit <strong><tt>+</tt></strong> verbunden), und dann den Nachnamen auf der Konsole aus.</p>
<div></div>
<p>Das nächste Beispiel <strong><tt>Person2.java</tt></strong> erzeugt nun      eine Person, weist den Variablen Werte zu und ruft  die Methode <strong><tt>printName</tt></strong> auf.</p>
<div></div>
<table>
<tbody>
<tr>
<td align="left">
<div>
<p>class Person {<br />
public String vorname;<br />
public String nachname;</p>
<p>public void printName()<br />
{<br />
System.out.println(vorname+&#8220; &#8220;+nachname);<br />
}</p>
<p>public static void main(String[]args)<br />
{<br />
Person einePerson = new Person();<br />
einePerson.vorname = &#8220;Hans&#8220;;<br />
einePerson.nachname = &#8220;Maier&#8220;;<br />
einePerson.printName();<br />
}<br />
}</p>
</div>
</td>
</tr>
</tbody>
</table>
<p><em>Listing: <a href="http://www.freiesmagazin.de/mobil/2009-10-listings/Person2.java">Person2.java</a></em></p>
<div></div>
<p>Was geschieht in diesem Programm? Der Einstiegspunkt ist wieder die <strong><tt>main</tt></strong>-Methode. Es wird eine Variable vom Typ <strong><tt>Person</tt></strong> mit dem Bezeichner <strong><tt>einePerson</tt></strong> deklariert. Dieser Variable wird ein neu erzeugtes Objekt zugewiesen, das durch <strong><tt>new</tt></strong> erzeugt wird.  Dadurch wird der sogenannte Konstruktor aufgerufen, der eine Methode ist, die ein neues Objekt zurückgibt. Hier steht kein Parameter in den runden Klammern, da der immer implizit vorhandene parameterlose Konstruktor aufgerufen wird. Nun kennt die Laufzeitumgebung eine Person mit dem Bezeichner <strong><tt>einePerson</tt></strong>, die jedoch noch keine zugewiesenen Werte für <strong><tt>vorname</tt></strong> und <strong><tt>nachname</tt></strong> hat. Dies ändert sich in den nächsten beiden Anweisungen. Über die Punktnotation werden die Variablen aufgerufen, und ihnen ein Wert zugewiesen. Letztendlich werden diese Variablen durch Aufruf von <strong><tt>printName</tt></strong> mit der Person <strong><tt>einePerson</tt></strong> auf der Konsole ausgegeben.</p>
<div></div>
<h3>Weiterführendes zu Klassen</h3>
<div></div>
<p>Das Klassenkonzept kann sehr intuitive Programmierung ermöglichen. Es ist beispielsweise möglich, mit dem Schlüsselwort <strong><tt>extends</tt></strong> eine Klasse aus einer anderen Klasse abzuleiten. Man spricht von Vererbung. Man könnte etwa eine Klasse <strong><tt>Mitarbeiter</tt></strong> erstellen, welche die Variable <strong><tt>personalnummer</tt></strong> (deklariert als <strong><tt>int</tt></strong>, also als ganze Zahl) enthält, und diese Klasse von <strong><tt>Person</tt></strong> ableiten. Jeder Mitarbeiter hätte damit automatisch auch die Variablen <strong><tt>vorname</tt></strong> und <strong><tt>nachname</tt></strong>, sowie die Methode <strong><tt>printName</tt></strong>, ohne dass man dies noch einmal in den Code schreiben muss. Die Syntax wäre:</p>
<div></div>
<table>
<tbody>
<tr>
<td align="left">
<div>
<p>class Mitarbeiter extends Person {<br />
public int personalnummer;<br />
}</p>
</div>
</td>
</tr>
</tbody>
</table>
<p><em>Listing: <a href="http://www.freiesmagazin.de/mobil/2009-10-listings/Mitarbeiter.java">Mitarbeiter.java</a></em></p>
<div></div>
<p>Nun „ist“ jeder Mitarbeiter auch eine Person. Und alle Methoden die für eine Person definiert sind, können auch von einem Mitarbeiter aufgerufen werden. Umgekehrt ist das natürlich nicht der Fall. Eine Person, die kein Mitarbeiter ist, hat die Variable <strong><tt>personalnummer</tt></strong> nicht. Der Compiler würde dies bemerken.</p>
<div></div>
<p>Es kann jedoch auch zu sehr abstrakten Beziehungen zwischen den Klassen kommen, die nicht unbedingt dem intuiven Verständnis entsprechen. Es ist beispielsweise möglich, dass ein Objekt eine Variable hat, die eine Liste ist, in dem das Objekt selbst noch einmal enthalten ist. Der Fantasie sind dort keine Grenzen gesetzt. Man denke nur an ein Kind, dass seinen Vater als Variable hat, während der Vater auch seine Kinder als Variablen hat.</p>
<div></div>
<h3>Ausblick</h3>
<div></div>
<p>Im nächsten Teil der Serie wird die Grafikprogrammierung mit Java ausführlich beschrieben.</p>
<div></div>
<p><span style="color:#595959;"><span style="font-size:xx-small;">Links</span></span></p>
<ol type="1">
<li> <a href="http://www.netbeans.org/"><tt>http://www.netbeans.org/</tt></a>
<div></div>
<div></div>
</li>
<li> <a href="http://www.eclipse.org/"><tt>http://www.eclipse.org/</tt></a>
<div></div>
<div></div>
</li>
<li> <a href="http://de.wikipedia.org/wiki/Swing_%28Java%29"><tt>http://de.wikipedia.org/wiki/Swing_(Java)</tt></a>
<div></div>
<div></div>
</li>
<li> <a href="http://www.java.com/de/"><tt>http://www.java.com/de/</tt></a>
<div></div>
<div></div>
</li>
<li> <a href="http://gcc.gnu.org/java/"><tt>http://gcc.gnu.org/java/</tt></a>
<div></div>
<div></div>
</li>
<li> <a href="http://www.java.com/de/download/help/testvm.xml"><tt>http://www.java.com/de/download/help/testvm.xml</tt></a>
<div></div>
<div></div>
</li>
<li> <a href="http://wiki.ubuntuusers.de/Java"><tt>http://wiki.ubuntuusers.de/Java</tt></a></li>
</ol>
<p><img style="border:medium none;position:absolute;z-index:2147483647;opacity:0.6;display:none;" src="image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAADsElEQVR4nK2VTW9VVRSGn33OPgWpYLARbKWhQlCHTogoSkjEkQwclEQcNJEwlfgD/AM6NBo1xjhx5LyJ0cYEDHGkJqhtBGKUpm3SFii3vb2956wPB/t+9raEgSs52fuus89613rftdcNH8/c9q9++oe/Vzb5P+3McyNcfm2CcPj9af9w6gwjTwzvethx3Bx3x8xwd1wNM8dMcTNUHTfFLPnX6nVmZpeIYwf3cWD/PhbrvlPkblAzVFurKS6GmmGqqComaS+qmBoTI0Ncu3mXuGvWnrJ+ZSxweDgnkHf8ndVTdbiT3M7cQp2Z31dRTecHAfqydp4ejhwazh6Zezfnu98E1WIQwB3crEuJ2Y45PBTAQUVR9X4At66AppoEVO1Q8sgAOKJJjw6Am6OquDmvHskZ3R87gW+vlHz98zpmiqphkkRVbQtsfPTOC30lJKFbFTgp83bWh7Zx/uX1B6w3hI3NkkZTqEpBRDBRzG2AQHcwcYwEkOGkTERREbLQ/8HxJwuW7zdYrzfZ2iopy4qqEspKaDYravVm33k1R91Q69FA1VBRzFIVvXbx5AgXT44A8MWP81yfu0utIR2aVK3vfCnGrcUNxp8a7gKYKiLCvY2SUvo/aNtnM3e49ucK9S3p0aDdaT0UAVsKi2tVi6IWwNL9JvdqTdihaz79/l+u/rHMxmaJVMLkS2OoKKLWacdeE3IsSxctc2D5Qcl6vUlVVgNt+fkPPcFFmTw1xruvT7SCd7nuVhDQvECzJH90h0azRKoKFRkAmP5lKTWAGRdefoZL554FQNUxB92WvYeA5UN4PtSqwB2phKqsqMpBgAunRhFR3j49zuU3jnX8k6fHEQKXzh1jbmGDuYU6s4t1rt6socUeLLZHhYO2AHSHmzt19ihTZ48O8Hzl/AmunD/BjTvrvPfNX3hWsNpwJCvwYm+ngug4UilSCSq6k8YPtxDwfA+WRawIWFbgscDiULcCEaWqBFOlrLazurupOSHLqGnEKJAY8TwBEHumqUirAjNm52vEPPRV4p01XXMPAQhUBjcWm9QZwijwokgAeYHlHYA06KR1cT6ZvoV56pDUJQEjw0KeaMgj1hPEY4vz2A4eW0/e1qA7KtQdsxTYAG0H3iG4xyK1Y+xm7XmEPOJZDiENzLi2WZHngeOjj2Pe+sMg4GRYyLAsx7ME4FnsyTD9pr0PEc8zPGRAwKXBkYOPEd96cZRvf11g9MDe7e3R4Z4Q+vyEnn3P4t0XzK/W+ODN5/kPfRLewAJVEQ0AAAAASUVORK5CYII%3D" alt="" width="24" height="24" /></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/echofalko.wordpress.com/49/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/echofalko.wordpress.com/49/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/echofalko.wordpress.com/49/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/echofalko.wordpress.com/49/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/echofalko.wordpress.com/49/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/echofalko.wordpress.com/49/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/echofalko.wordpress.com/49/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/echofalko.wordpress.com/49/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/echofalko.wordpress.com/49/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/echofalko.wordpress.com/49/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/echofalko.wordpress.com/49/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/echofalko.wordpress.com/49/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/echofalko.wordpress.com/49/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/echofalko.wordpress.com/49/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=echofalko.wordpress.com&amp;blog=4079735&amp;post=49&amp;subd=echofalko&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://echofalko.wordpress.com/2009/12/01/java-teil-1-einfuhrung-in-eine-moderne-sprache/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/d956046007bf9dc22d3e498c20a959fd?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">echofalko</media:title>
		</media:content>
	</item>
		<item>
		<title>Rezension: Coding for Fun</title>
		<link>http://echofalko.wordpress.com/2009/05/12/rezension-coding-for-fun/</link>
		<comments>http://echofalko.wordpress.com/2009/05/12/rezension-coding-for-fun/#comments</comments>
		<pubDate>Tue, 12 May 2009 15:45:00 +0000</pubDate>
		<dc:creator>echofalko</dc:creator>
				<category><![CDATA[IT]]></category>

		<guid isPermaLink="false">http://echofalko.wordpress.com/?p=5</guid>
		<description><![CDATA[Verlag: Galileo Computing, 2008 Diesen Artikel schrieb ich für freiesmagazin. Womeringer möchte, dass der Leser allen Ernstes Spaß mit dem Computer hat. Dies ist kein Widerspruch. Mit dem nötigen mathematischen und technischen Hintergrundwissen ausgerüstet, tritt der Leser eine Reise durch die Geschichte der Programmierung an und stößt dabei auf ungewöhnliche, nostalgische, lehrreiche oder auch einfach [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=echofalko.wordpress.com&amp;blog=4079735&amp;post=5&amp;subd=echofalko&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Verlag: Galileo Computing, 2008<br />
Diesen Artikel schrieb ich für <a href="http://www.freiesmagazin.de">freiesmagazin</a>.<br />
Womeringer möchte, dass der Leser allen Ernstes Spaß mit dem Computer hat. Dies ist kein Widerspruch. Mit dem nötigen mathematischen und technischen Hintergrundwissen ausgerüstet, tritt der Leser eine Reise durch die Geschichte der Programmierung an und stößt dabei auf ungewöhnliche, nostalgische, lehrreiche oder auch einfach nur unterhaltsame Programme, die stets zum Nachmachen und Mitmachen einladen.</p>
<p><img class="aligncenter size-medium wp-image-11" title="cover" src="http://echofalko.files.wordpress.com/2009/05/cover1.jpg?w=300&#038;h=230" alt="cover" width="300" height="230" /></p>
<h2>Allgemeines</h2>
<p>Zum Lieferumfang des über 500 Seiten starken Softcover-Buches gehört eine umfangreiche Begleit-DVD, die alles nötige beinhaltet, um die vorgestellten Programme selbst auszuprobieren und weiterzuentwickeln. Auf der DVD befinden sich u.A. Quelltexte, vorkompilierte Programmbeispiele, hilfreiche Tools für die Erstellung von Diskettenabbildern, FreeDOS und die Desktop-CD von Ubuntu. Letztere entspricht in der ersten Auflage leider noch der Version 7.10, sodass man mittlerweile lieber eine aktuellere Version installieren sollte. Es sei noch angemerkt, dass einige mitgelieferte Programme als .exe vorliegen, und damit eine fehlerfrei Ausführung mit Wine nicht immer garantiert ist.<br />
Neben den vielen anschaulichen Beispielen zu nahezu jedem Programmierparadigma, vermittelt der Autor zunächst unabdingbares theoretisches Wissen. Hier wird auch die eigentliche Zielgruppe bereits deutlich: Ohne Interesse an Mathematik und Technik wird man an diesem Buch wohl keine Freude haben, obwohl der Titel und die jungen Menschen auf dem Cover vielleicht den Eindruck eines jugendfreundlichen Buches vermitteln. So wird der Leser bereits im ersten Abschnitt mit vermeintlichen Schreckgespenstern aus der theoretischen Informatik wie der Turing-Maschine, der Turing-Vollständigkeit oder dem Gödelschen Unvollständigkeitssatz konfrontiert. Die Erläuterungen sind gemessen an der Kürze der Ausführungen aber schlüssig, logisch und auch für Hobbyisten nachvollziehbar, wobei im gesamten Buch auf mathematischen Formalismus wohlwollend verzichtet wird. Der Gebrauch von einschlägigen Tools zur Virtualisierung wird dringend empfohlen und ist im Anhang des Buches freundlicherweise genau beschrieben, sodass hier keine Vorkenntnisse nötig sind. Die Gratwanderung zwischen Einsteigerfreundlichkeit und Anspruch versucht der Autor durch Kenntlichmachung von einzelnen Abschnitten zu meistern. Es werden Abschnitte für Kenner mit einem Pacman und Abschnitte für Könner, etwas humoristisch, mit einem Geist gekennzeichnet. So kann man getrost mal einen Abschnitt überspringen, dem man sich nicht gewappnet fühlt, um an späterer Stelle noch einmal zurückzukommen. Zwischendurch dienen immer wieder Abschnitte über die geschichtliche Entwicklung der Auflockerung.</p>
<h2>BASIC und Assembler</h2>
<p style="text-align:left;">Die Zeitreise beginnt mit der Sprache BASIC. Hierzu bedient man sich zunächst eines virtuellen DOS, welches man zuvor z.B. mit VirtualBox angelegt hat. Hier erlent man spielerisch das GOTO-Prinzip und bekommt einen großen Happen Nostalgie und ein Erfolgserlebnis als Belohnung. Als nächstes kann man mit dem Emulator x64 die alten Zeiten richtig wieder aufleben lassen und mit dem legendären Commodore 64 samt eingebautem BASIC-Interpreter Retroluft schnuppern. Eine Laufschrift und eine grafische Spielerei mit geometrischen Figuren werden hier vorgestellt, anhand derer man den Umgang mit zählenden Schleifen lernt.<br />
<img class="aligncenter size-full wp-image-17" src="http://echofalko.files.wordpress.com/2009/05/c64.png?w=450" alt=""   /><br />
Wer sich schon immer einmal mit seiner CPU unterhalten wollte, erhält eine kleine Einführung in die Assembler-Programmierung. Auch hier nutzen wir wieder eine virtuelle DOS-Machine und einen mitgelieferten hübschen grafischen Debugger, der es uns ermöglicht, Schritt für Schritt einzelne Befehle auszuführen. Dabei hält uns die mehrfach geteilte Ansicht stets auf dem Laufendem was den Stack, die nächsten Befehle und die Register angeht.<br />
<img class="aligncenter size-full wp-image-15" src="http://echofalko.files.wordpress.com/2009/05/afd2.png?w=450&#038;h=292" alt="" width="450" height="292" /><br />
Wer den letzten Satz nicht vollständig verstanden hat, ist genau auf dem richtigen Wissensstand für dieses Kapitel. Die wichtigsten Befehle und Register werden erklärt, wobei die Erläuterung des Stacks, dessen Verständnis unabdingbar ist, leider kaum angerissen wird. Hier sind also Vorkenntnisse, oder die Bereitschaft sich über das Buch hinaus mit diesem Thema zu beschäftigen nötig.</p>
<h2 style="text-align:left;">Spiele und bunte Landschaften</h2>
<p>Selbstverständlich kommen die von so vielen Menschen geliebten Computerspiele nicht zu kurz. Hier ist der erste Halt der Klassiker Pong. Während die Urfassung noch in Hardware realsiert war, wird uns hier der komplette Quellcode als Java-Projekt für die Entwicklungsumgebung Eclipse zur Verfügung gestellt. Etwas verruchter wird es beim Spiel &#8222;Hack The Game V. 1.21&#8220;. Hier kann man seine kriminelle Energie entladen und Daten von fremden Hosts stehlen, löschen und weitere Schandtaten begehen. Auf alle Fälle ein sehr unterhaltsames Spiel, das trotz der eindeutigen Ziele des Protagonisten pädagogisch wertvoll ist, da man beinahe zwangsläufig langjährige virtuelle Haftstrafen antreten muss. Für Grafikinteressierte ist auch eine Anleitung für das Tool Blender, sowie ein Programmbeispiel in Java3D gegeben.</p>
<h2>Das Apfelmännchen und das Chaos</h2>
<p>Besondere Erwähnung gebührt dem Abschnitt über Fraktale. Neben der durchaus lesenswerten Erklärung dieser Muster mit Selbstähnlichkeiten und Skaleninvarianzen, wird auf das Programm &lt;&gt; verwiesen, welches man als Mathematik- und/oder Kunstfreund nicht auslassen sollte. Alternativ kann man auch die neuste Version direkt von der Projektseite kostenfrei herunterladen. Es bietet sehr aufschlussreiche Präsentationen zu diesem Thema und eine verblüffende Zoom-Funktion für die angezeigten Fraktale. Dies schafft einen nahtlosen Übergang zu rekursiven Programmen, die beispielhaft anhand eines kleinen Java-Programms vorgestellt werden, welches ein einfaches Fraktal mit erstaunlich wenig Code erzeugt. Könner werden auch eingeladen, ihre eigenen Visualisierungen mit Java zu realisieren. Was zunächst wie eine Spielerei wirkt, ist in der Realität Grundlage dafür, naturgegebene Strukturen in Programmen nachzubilden und aus der heutigen Informatik nicht mehr wegzudenken.<br />
<img src="http://echofalko.files.wordpress.com/2009/05/apfel.png?w=450&#038;h=337" alt="" title="" width="450" height="337" class="aligncenter size-full wp-image-20" /></p>
<h2>Betriebssysteme &#8211; Vergessene Legenden</h2>
<p>Beim Thema Betriebssysteme wird etwas weiter ausgeholt. Mit einem flüssig zu lesenden Abriss über die Geschichte erhält man Einblicke in längst vergessene Kapitel, insbesondere der GUI-Historie. Oberflächen wie Smalltalk 80, GEM (zum ausprobieren auf der DVD mitgeliefert) oder das Echtzeitsystem QNX werden vorgestellt. Über den C64 bis zu modernen Linux-Distributionen (als Beispiel wird Ubuntu vorgestellt) erhält man einen Überblick über die Entwicklung von Betriebssystemen und der Programmiersprachen, die mit den Systemen einhergingen. Besonders anschaulich ist ein in Java implementierter Netzgraph, der die Verwandtschaftsbeziehungen zwischen den Prorgammiersprachen verdeutlicht.<br />
<img src="http://echofalko.files.wordpress.com/2009/05/gem.png?w=450&#038;h=383" alt="" title="" width="450" height="383" class="aligncenter size-full wp-image-22" /></p>
<h2>KI &#8211; Ist Skynet möglich?</h2>
<p>Der Traum vom denkenden Rechner ist noch älter als die Informatik. Dieses Kapitel bringt dem Leser die unterschiedlichen Ansätze näher, mit denen man versucht, schwache oder gar starke künstliche Intelligenzen zu erzeugen. Die Simulation von neuronalen Netzen wird unter anderem anhand des Tools MemBrain erklärt. Hiermit kann man beispielsweise einem Sytem aus nur sechs Neuronen Wissen antrainieren, welches auf Abfrage auch korrekt wiedergegeben wird. Mit einer solchen assoziativen Speicherung erhält man sogar Antworten auf Fragen, die dem System nie explizit beigebracht wurden. Die Antwort lässt sich nicht vorhersehen. Hier liegt die Analogie zum menschlichen Verstand: Wissen wir etwas nicht, so versuchen wir Schlüsse zu ziehen. Hier ist also sehr viel Spielraum für weiterführende Experimente mit diesem Tool. Eine andere Herangehensweise bieten die vorgestellten Programmiersprachen Smalltalk, Lisp und Prolog. Letztere gibt beispielsweise die Möglichkeit, eine Wissensbasis mit allgemein gehaltenen Aussagen zu schreiben, anhand derer dann konkrete Fragen an das Programm gestellt werden können. Hier ergeben sich allerdings keine unvorhersehbaren Antworten, da z.B. durch Rekursion oder Backtracking so lange Aussagen abgeleitet werden, bis eine verlässliche Antwort gefunden ist, oder bis die Unmöglichkeit einer verlässlichen Antwort bewiesen ist. Anschaulich dargestellt: Wenn ich nur weiß, dass die Straße immer glatt ist, wenn sie kälter als 0°C ist, kann ich stets bejahen, dass die Straße glatt ist wenn es friert. Andererseits kann ich nicht mit Sicherheit sagen ob es friert, nur weil die Straße glatt ist.</p>
<h2>Programmieren lernen</h2>
<p>Der letzte Abschnitt ist eine Einführung in die Programmierung in der Sprache BASIC mit Hilfe der unfreien Entwicklungsumgebung VB Express von Microsoft. Anhand eines Ameisenvolkes kann man spielerisch mit der Umgebung und der Sprache vertraut werden. Praktischerweise liegt das umfassende Buch &#8222;Visual Basic 2005&#8243; als html Version bei, sodass man sich tiefgründig mit der Sprache auseinandersetzen kann.</p>
<h2>Fazit</h2>
<p>Womeringer überzeugt mit guter Auswahl seiner Beispiele und mit einem sehr flüssigen Schreibstil. Man lässt sich gern mit auf die Reise nehmen und möchte alles ausprobieren und verstehen. Dies wird aber leider nicht jedem gelingen. Die Materie ist durchaus anspruchsvoll und nicht immer einsteigerfreundlich. Für den ambitionierten Einsteiger, der bereits wenigstens eine moderne Programmiersprache in Grundzügen verstanden hat, beiten sich Herausforderungen, die ihn stets fordern. Experten der Programmierung finden zumindest spannende Beispiele in ungewohnten Gefilden, die ihnen vielleicht bis dato verborgen blieben. Anfänger können angesichts der Fülle an thematisch völlig unterschiedlichen Kapiteln leicht den Überblick verlieren. Auch die Tatsache, dass die Kapitel nie erschöpfende Ausführungen enthalten, tragen hierzu bei. Man darf aber nicht vergessen, dass das Buch nicht den Anspruch hat ein Lehrbuch zu sein. Dazu treffend im Vorwort: </p>
<blockquote><p>Es wäre schön, wenn sich Leser finden würden, die das Buch als Sammlung von Anregungen verstehen.</p></blockquote>
<p> Erfahrenen Linux-Benutzern könnte noch negativ auffallen, dass von den 573 Seiten stolze 182 auf den Anhang fallen, der Anleitungen zur Installation von VirtualBox, Xen, FreeDOS, Ubuntu, Java und weiterer Software enthalten. Für weitere Informationen und Leseproben bietet sich ein Besuch der <a href="http://www.galileocomputing.de">Seite</a> des Verlages an.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/echofalko.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/echofalko.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/echofalko.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/echofalko.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/echofalko.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/echofalko.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/echofalko.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/echofalko.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/echofalko.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/echofalko.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/echofalko.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/echofalko.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/echofalko.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/echofalko.wordpress.com/5/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=echofalko.wordpress.com&amp;blog=4079735&amp;post=5&amp;subd=echofalko&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://echofalko.wordpress.com/2009/05/12/rezension-coding-for-fun/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/d956046007bf9dc22d3e498c20a959fd?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">echofalko</media:title>
		</media:content>

		<media:content url="http://echofalko.files.wordpress.com/2009/05/cover1.jpg?w=300" medium="image">
			<media:title type="html">cover</media:title>
		</media:content>

		<media:content url="http://echofalko.files.wordpress.com/2009/05/c64.png" medium="image" />

		<media:content url="http://echofalko.files.wordpress.com/2009/05/afd2.png" medium="image" />

		<media:content url="http://echofalko.files.wordpress.com/2009/05/apfel.png" medium="image" />

		<media:content url="http://echofalko.files.wordpress.com/2009/05/gem.png" medium="image" />
	</item>
	</channel>
</rss>
