Programmieren mit Java und NetBeans

Aus LinuxUser 12/2004

Programmieren mit Java und NetBeans

Überraschungen im Advent

Viele Computer-Liebhaber prägt eine Abneigung gegen herkömmliche Bastelei. Manche Menschen greifen mit Spaß zu Nadel und Faden, andere ziehen einen selbstprogrammierten Adventskalender vor. Wir geben eine Einführung in die Sprache Java [1] an Hand dieses Beispiels.

Ein großer Vorteil der Programmiersprache Java liegt in ihrer plattformübergreifenden Verfügbarkeit. Ein Java-Programm lässt sich unter Linux genauso wie unter Windows ausführen.

Werkzeuge

Das Entwickeln von Programmen in Java, setzt die zugehörige Software voraus. Sie brauchen das Java Development Kit (JDK), die aktuelle Version 5.0 liegt auf der Heft-CD. Wir zeigen die Programmierung mit der Entwicklungsumgebung NetBeans [2], die ebenfalls auf der Heft-CD liegt. Bevor sich die Installationsprogramme für JDK und NetBeans ausführen lassen, benötigen sie entsprechende Berechtigungen. Kopieren Sie die beiden Dateien jdk-1_5_0-linux-i586.bin und netbeans-4_0-beta2-linux.bin auf die Festplatte, machen Sie sie ausführbar und starten Sie das Installationsprogramm:

chmod u+x jdk-1_5_0-nb-4_0-beta2-bin-linux.bin
./jdk-1_5_0-nb-4_0-beta2-bin-linux.bin

Bei NetBeans funktioniert es anschließend analog, beide Installationsprogramme installieren die Software unterhalb des aktuellen Verzeichnisses.

Nach dem ersten Start von NetBeans mit ./netbeans-4.0beta2/bin/netbeans erscheint ein Willkommens-Dialog (Abbildung 1). Hier wählen Sie aus, ob Sie ein neues Projekt erstellen oder ein Beispielprojekt anschauen möchten.

Abbildung 1: Die Entwicklungsumgebung Netbeans erleichtert die Java-Programmierung.

Abbildung 1: Die Entwicklungsumgebung Netbeans erleichtert die Java-Programmierung.

Beginnen Sie ein neues Projekt mit dem Button New Project. Im erscheinenden Dialog (Abbildung 2) finden Sie unter der Kategorie Standard die Möglichkeit, eine neue Java-Applikation zu erstellen. Im zweiten Schritt geben Sie einen Projektnamen ein, in unserem Fall lautet er Adventskalender. Die Funktion Create Main Class schalten Sie für dieses Projekt ab; sie würde das Schreiben einer eigenen main-Funktion ersparen, jedoch auch den Quelltext mit für dieses Programm unnötigen Zeilen füllen.

Abbildung 2: Im ersten Schritt erstellen Sie ein neues NetBeans-Projekt.

Abbildung 2: Im ersten Schritt erstellen Sie ein neues NetBeans-Projekt.

Schnellstart

Benutzen Sie NetBeans zum ersten Mal, liest das Programm nach dem Anlegen des neuen Projekts alle verfügbaren Java-Klassen ein, das dauert je nach Systemgeschwindigkeit recht lange.

Im Reiter Files im linken Bereich des NetBeans-Fensters befindet sich in Form einer Baumstruktur eine Liste aller bisher angelegten Dateien. Unter dem Ordner src stehen alle Quelltextdateien mit der Endung .java.

In der Werkzeugleiste befinden sich die Buttons Run Main Project und Debug Main Project, die sich auch über die Tasten [F6] und [F5] aufrufen lassen. Ersterer kompiliert und startet das aktuelle Projekt, der Zweite tut dasselbe im Debug-Modus, also mit ausführlicherer Ausgabe zur Fehlersuche.

Fenster einbauen

Unser Adventskalender soll in einem Hauptfenster ein weihnachtliches Hintergrundbild zeigen und eine Eingabemöglichkeit erhalten. Dazu erstellen Sie eine neue Klasse, die ein zunächst leeres Fenster erzeugt.

Diese Aufgabe erleichtert der NetBeans-Dialog, den Sie über den Button New File… öffnen. Im ersten Schritt wählen Sie im Feld Categories den Eintrag Java Classes aus. Eine neue Klasse erhalten Sie dann über den Dateityp (File type) namens Java Class.

Im nächsten Schritt geben Sie einen Namen für die Klasse ein. Da Sie nun die Hauptklasse erstellen, benennen Sie sie Adventskalender. Automatisch benennt NetBeans die Datei nach dem Klassennamen; unter Java muss der Dateiname identisch sein mit der darin enthaltenen Klasse. Ein Klick auf Finish legt die neue Datei an und öffnet sie im Editor, gefüllt mit der Basisstruktur (Abbildung 3).

Abbildung 3: Die erste Klasse besteht zunächst nur aus dem Klassenkopf und dem Konstruktor.

Abbildung 3: Die erste Klasse besteht zunächst nur aus dem Klassenkopf und dem Konstruktor.

Um ein Hauptfenster zu erzeugen, verwendet unser Adventskalender die in Java enthaltene Klasse JFrame. Dazu dient der Zusatz extends JFrame in der Zeile zur Klassendeklaration im Kopf der Datei. Die Hauptklasse erbt so alle Eigenschaften von JFrame, lässt sich aber darüberhinaus beliebig erweitern.

public class Adventskalender extends JFrame {

Das reicht dem Compiler aber nicht, um die Klasse JFrame zu finden. Denn sie gehört zur Java-Grafikbibliothek Swing. Eine neue Zeile am Anfang der Datei bindet die Bibliothek ein:

import javax.swing.*;

Unser Beispiel verwendet im späteren Ablauf weitere Bibliotheken, die Sie auf dieselbe Art importieren. Fügen Sie folgende Zeilen ebenfalls am Anfang der Datei ein:

import java.awt.*;
import java.awt.event.*;
import java.lang.*;
import java.util.*;

Nun bauen Sie die Hauptfunktion der Klasse Adventskalender, sie heißt stets main und besteht in unserem Beispiel aus nur drei Zeilen:

public static void main(String args[]) {
 new Adventskalender().setVisible(true);
}

Die erste Zeile, die Funktionsdeklaration, macht diese Funktion mit public öffentlich; dadurch lässt sie sich von außen verwenden, ohne zuvor ein Objekt dieser Klasse anzulegen. Das ermöglicht es, erst in der Funktion selbst ein Objekt der Klasse Adventskalender anzulegen.

Die Funktion gibt keinen Wert zurück, das drückt das Kommando void (Lücke) aus. Sie nimmt aber einen Wert entgegen, nämlich ein Feld vom Typ String. Eingehende Parameter stehen mitsamt ihrem Datentyp zwischen runden Klammern in der Deklarationszeile. Der Ausdruck String args[] enthält die beim Aufruf der Klasse übergebenen Kommandozeilenparameter.

In der zweiten Zeile erstellt die main-Funktion ein neues Objekt der Klasse Adventskalender über das Schlüsselwort new. Der zweite Teil der Anweisung – setVisible(true) – ruft eine über die Klassendeklaration geerbte Funktion von JFrame auf, damit das Fenster sichtbar wird. Parameter wie Fenstergröße oder -titel lassen sich im Konstruktor der gesamten Klasse, also im Kopfbereich, definieren; in unserem Beispiel sieht sein Anfang so aus:

public Adventskalender () {
 setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
 this.setSize(560, 450);
 this.setResizable(false);
 this.setTitle("Advent");

Das Schlüsselwort this bezeichnet immer das zu initialisierende Objekt. Die Anweisung in der zweiten Zeile sorgt dafür, dass das Schließen des Adventskalenderfensters den gesamten Prozess beendet. Das geschieht nicht automatisch; ohne diese Zeile bleibt der verwendete Arbeitsspeicher belegt.

Die folgende Anweisung legt die Größe des Fensters fest, so dass das Bild hineinpasst. setResizable(false) verhindert, dass der Benutzer die Fenstergröße ändert. Das Bild behält nämliche seine Größe bei, unabhängig von der des Fensters. Die letzte Zeile schließlich beschriftet die Titelleiste des Fenster mit Advent.

Benutzer am Zug

Java bietet einige fertige Layouts, die grafische Elemente unterschiedlich positionieren. Unser Beispiel verwendet das BorderLayout. Es setzt ein Feld an jeden Rand sowie eines in die Mitte. Auch dieses Layout erzeugt unser Beispiel im Konstruktor der Klasse Adventskalender. Nach dem Erstellen eines BorderLayouts legen Sie darin zunächst ein Textfeld an, das die Benutzereingabe einliest. Diesem Textfeld weisen Sie die Variable text zu:

getContentPane().setLayout(new BorderLayout());
text = new JTextField("Tag", 5);

Das neue Textfeld enthält durch diese Voreinstellung zunächst das Wort “Tag”. Eine Variable muss in Java vor oder spätestens bei ihrer ersten Verwendung deklariert werden, dabei weisen Sie ihr einen Datentyp zu. Die Variable text hat hier den Typ JTextField. Da sie nur innerhalb dieser Klasse verwendet wird, braucht sie in diesem Fall nicht von außen zugänglich zu sein. Erklären Sie sie also zur Privatsache; in den Kopf der Klasse, noch vor den Konstruktor, schreiben Sie dazu diese Zeile:

private JTextField text;

Um die Benutzereingabe im Textfeld auszulesen und darauf zu reagieren, erweitern Sie die Klasse Adventskalender um ein Benutzer-Interface. Dazu schreiben Sie in die Klassendeklarationszeile hinter den Eintrag extends JFrame zusätzlich implements ActionListener. Diese Funktion wartet auf zunächst nicht näher definierte Interaktion des Benutzers. Unser Beispiel liest damit die Eingabe des Tages ein, um die zugehörige Überraschung zu präsentieren. Binden Sie den ActionListener ins zuvor angelegte Textfeld ein mit den folgenden Zeilen im Konstruktor der Klasse:

text.addActionListener(this);
text.setActionCommand("Textfeld");
getContentPane().add(text, BorderLayout.SOUTH);

Zunächst wird dem Textfeld der ActionListener hinzugefügt. Die zweite Zeile bezeichnet erhaltene Benutzereingaben als Textfeld. Dadurch erfährt eine andere Funktion, worum es sich handelt und kann die passende Reaktion auslösen. Danach sorgt getContentPane().add dafür, dass das Textfeld sichtbar wird. Das Schlüsselwort SOUTH steht im BorderLayout für das Feld am unteren Rand des Fensters. Um erhaltene Aktionen auszuwerten, fügen Sie die Funktion actionPerformed aus Listing 1 in die Klasse unter den Konstruktor ein.

Abbildung 4: NetBeans bietet einen Überblick über die Dateien eines Projekts.

Abbildung 4: NetBeans bietet einen Überblick über die Dateien eines Projekts.

Listing 1

Die Funktion actionPerformed

public void actionPerformed(ActionEvent e) {
 if(e.getActionCommand() = "Textfeld"){
  String datum = text.getText();
  try{
   int nummer = Integer.decode(datum).intValue();
   reaction(nummer);
  }
  catch(NumberFormatException evt){
   JOptionPane.showMessageDialog(this, "Die Eingabe ist leider nicht gültig.");
  }
 }
}

Diese Funktion hat keinen Rückgabewert (void) und wird aufgerufen, wenn der ActionListener eine Aktion feststellt. Als erstes überprüft die Funktion mit dem if-Befehl, ob das Kommando Textfeld übergeben wurde. Nur wenn dies der Fall ist, führt unsere Funktion etwas aus.

Dann speichert die Funktion getText den eingegebenen Text in der Variablen datum. Der Datentyp lautet String, sie speichert Daten also in Form einer Zeichenkette.

Der Block mit try und catch fängt eventuell auftretende Fehler ab, ohne dass das gesamte Programme abbricht. Im try-Block versucht die Funktion, die in datum gespeicherte Benutzereingabe in Form einer Zeichenkette in den Datentyp Integer umzuwandeln, eine ganze natürliche Zahl. Das funktioniert nur dann, wenn der Benutzer keine Buchstaben oder Sonderzeichen eingegeben hat. Gibt es keine Probleme, ruft das Programm die Funktion reaction auf und übergibt ihr den Integer-Wert der Benutzereingabe.

Gibt der Benutzer ungültige Zeichen ein, also irgendetwas außer Zahlen, führt das zum Code im catch-Block. Die einzige Zeile darin gibt ein Textfenster aus, das den Benutzer über den Fehler informiert.

Leinwand aufstellen!

Vor der Definition der Adventsüberraschungen vervollständigen Sie zunächst das Hauptfenster mit einem Hintergrundbild. Um es darzustellen, verwendet unser Beispiel eine eigene Klasse. Im Reiter Files oder Projects erhalten Sie mit einem Rechtsklick auf das Projekt Adventskalender ein Kontextmenü; darin wählen Sie NewJava Class…, als Klassennamen geben Sie Schneemann ein.

Für den grafischen Hintergrund des Bilds sorgt die in Java enthaltene Klasse Canvas. Erweitern Sie deshalb die Klasse Schneemann in der Klassendeklaration um extends Canvas.

Nun legen Sie ein neues Objekt der ebenfalls in Java enthaltenen Klasse Image an und deklarieren zwei Integer-Variablen, die Höhe und Breite des Bild enthalten werden. Die Klasse Schneemann greift als einzige direkt auf diese neuen Ojekte zu, so dass Sie sie getrost als private definieren. Die folgenden Zeilen im Kopf der neu angelegten Klasse sorgen dafür:

private Image img;
private int x, y;

Um Zugriff auf die Klassen Image und Canvas zu erben, importieren Sie den Bibliotheksteil java.awt.*. Zudem benötigt das Einlesen der Bilddatei java.net.*, damit Sie den Ort einer Datei als URL angeben können. So erhält der Adventskalender beim Ausführen Zugriff auf alle Verzeichnisse. Dies geschieht am Anfang der Datei, noch vor der Klassendeklaration:

import java.awt.*;
import java.net.*;

Auch die Klasse Schneemann benötigt einen Konstruktor. Er soll als Argument eine Zeichenkette entgegennehmen, die die Adresse des einzubindenen Bilds enthält:

public Schneemann(String stg) {

Dieses übergebene Argument speichert unser Beispiel in einer Variablen des Typs URL. Daraus erstellt es ein neues Bildobjekt namens img:

URL url = getClass().getResource(stg);
img = getToolkit().createImage(url);

Zur zuvor importierten Bibliothek AWT gehört die Klasse MediaTracker. Sie lädt Multimedia-Objekte und gibt dabei den Status des Einlesevorgangs wieder. Damit lässt sich verhindern, dass sich Bilder langsam Stück für Stück aufbauen. Erstellen Sie also ein neues Objekt dieser Klasse, das das in der Variablen img enthaltene Bild speichert:

MediaTracker mt = new MediaTracker(this);
mt.addImage(img, 0);

Anschließend benutzen Sie wieder einen try-Block, um das Bild erst dann anzuzeigen, wenn es vollständig geladen ist. Wichtiger als bei lokalen Dateien wie in diesem Beispiel ist das bei übers Netz geladenen Objekten.

Im try-Block prüft die MediaTracker-Methode waitForAll(), ob das Bild vollständig und fehlerlos geladen ist. Im Falle eines Fehlers kommt die catch-Anweisung zum Zuge und tut überhaupt nichts.

try{
    mt.waitForAll();
}
catch(InterruptedException e){}
x = img.getWidth(this);
y = img.getHeight(this);
repaint();

Die Variablen x und y enthalten Höhe und Breite des Bilds, die sie von Methoden getWidth und getHeight erhalten. Der Aufruf repaint(); aktualisiert den Bildinhalt mit Hilfe der Methode paint. Die Klasse Canvas bringt diese Methode bereits mit, jedoch in unzureichender Form: canvas.paint löscht lediglich den Fensterinhalt, unser Beispiel überschreibt diese mitgelieferte Methode deshalb mit einer eigenen Definition. Sie stellt sicher, dass die img-Variable nicht leer ist und zeichnet in dem Fall das Bild. Fügen Sie deshalb diese Zeilen nach dem Konstruktor ein:

public void paint( Graphics g ){
 if(img != null) g.drawImage(img, 5, 5, this);
}

Darunter folgen die Methoden getWidth und getHeight:

public int getWidth(){
 return x;
}
public int getHeight(){
 return y;
}

Nun ist die Hauptklasse Adventskalender an der Reihe, ein Objekt der Klasse Schneeman zu erstellen. Dazu reicht eine Anweisung in der letzten Zeile des Konstruktors von Adventskalender:

getContentPane().add(new Schneemann("schneetux.jpg"), BorderLayout.CENTER);

Dieser Aufruf erzeugt ein neues Objekt Schneemann, als Parameter übergibt er der Klasse den Namen der Bilddatei. Dahinter fügt er das gezeichnete Bild ins BorderLayout als zentrales Feld ein.

Abbildung 5: Das Hauptfenster versprüht eine weihnachtliche Note.

Abbildung 5: Das Hauptfenster versprüht eine weihnachtliche Note.

Eingaben auswerten

Nun fehlt noch die Definiton der Reaktionen auf gültige Benutzereingaben; dafür soll die Funktion reaction verantwortlich zeichnen. Ungültige Versuche fängt schon der oben beschriebene try-Block ab

Als Parameter soll sie den vom Benuzter über das Textfeld angegebenen Kalendertag entgegennehmen. Um an Hand des Datums zu überprüfen, ob ein Benutzer zu früh die Tür eines Tages öffnen möchte, legen Sie zunächst Ihre Zeitzone fest. Im Falle von Deutschland heißt sie Europe/Berlin. Damit erstellen Sie anschließend einen passenden Kalender und ein Objekt des Datentyps Date. Zu diesem Zweck benötigt die Klasse Adventskalender den Bibliotheksteil java.util.*. Importieren Sie diese also ebenfalls am Anfang der Datei Adventskalender.java mit

import java.util.*

Nun folgt die Deklaration der Funktion reaction am Ende der Klasse. Sie benutzt Sie die Variablen tz, calender und trialTime, in denen sie die Zeitzone, einen dazu passenden Kalender und die aktuelle Zeit mit Datum speichert. An Hand der Variable trialTime setzen Sie dann die Zeit von calendar mit der Methode setTime der Klasse Calendar auf die aktuelle Zeit:

private void reaction(int datum){
 TimeZone tz = TimeZone.getTimeZone("Europe/Berlin");
 Calendar calendar = new GregorianCalendar(tz);
 Date trialTime = new Date();
 Calendar.setTime(trialTime);
 […]

Die folgenden Abfragen stellen sicher, dass der Benutzer keine zukünftigen Adventskalendereinträge zu Gesicht bekommt. Der erste if-Block prüft, ob bereits Dezember ist. Die Methode MONTH der Klasse Calendar gibt die Monate allerdings in Zahlen von 0 bis 11 aus. Um das mit den Kalendermonaten 1 bis 12 abzugleichen, addiert unser Beispiel 1 dazu:

if(calendar.get(Calendar.MONTH)+1!=12){
 JOptionPane.showMessageDialog(this, "…" );
 return;
}

Eine zweite if-Abfrage prüft den Kalendertag:

if(datum > calendar.get(Calendar.DATE){
 JOptionPane.showMessageDialog(this, "…");
 return;
}

Die Anweisung return; beendet die Funktion, nachdem der Benutzer das Warnfenster geschlossen hat.

Abbildung 6: Zu frühes Linsen wird abgelehnt.

Abbildung 6: Zu frühes Linsen wird abgelehnt.

Damit erhält niemand zu früh Zugang zu einer Tagesüberraschung. Es fehlen aber noch die Reaktionen auf gültige Eingaben. Ein switch/case-Block wertet die Variable datum aus:

switch(datum){
 case 1:
  […]
  break;
 case 2:
 […]
 case 24:
  […]
}

Die break-Anweisung in jedem case-Block sorgt dafür, dass switch nach einem Treffer die anderen Möglichkeiten nicht weiter überprüft. Zum Einfügen der einzelnen Anweisungen benötigen Sie zunächst weitere Klassen.

Multimedial

Um Bilder einzubinden, benutzt unser Adventskalender die Schneemann-Klasse. Sie ist generisch und lässt sich so auch zum Darstellen von Bildern verwenden. Lediglich ein eigenes Anzeigefenster fehlt zu diesem Zweck noch, in der die Schneemann-Klasse die Grafik abbildet.

Erstellen Sie also eine weiter neue Klasse über den NetBeans-Dialog New File… und geben ihr den Namen Bilder. Ihr vererben Sie die Eigenschaften der Klasse JDialog mittels extends JDialog in der Deklarationszeile. Zudem benötigt auch sie die Bibliotheken AWT und Swing, importieren Sie sie am Anfang der Datei:

import java.swing.*
import java.awt.*

Der Konstruktor übernimmt als Parameter den Dateinamen des anzuzeigenden Bildes, den es von der reaction-Funktion erhält. In die runden Klammern der Klassendeklaration schreiben Sie dazu String stg. Dann erzeugen Sie ein BorderLayout wie in der Klasse Adventskalender. Ein neues Objekt der Klasse Schneemann kümmert sich um die Darstellung. Die Klasse Schneemann informiert zudem über Breite und Höhe des angelegten Bildobjekts. Damit legen Sie ein Fenster dieser Maße an und positionieren das Bild als CENTER im BorderLayout (Listing 2, Abbildung 7).

Abbildung 7: Die Klasse Schneemann stellt Bilder aller Art dar.

Abbildung 7: Die Klasse Schneemann stellt Bilder aller Art dar.

Listing 2

Die Klasse <I>Bilder<I>

public class Bilder extends JDialog{
 public Bilder(String stg) {
  getContentPane().setLayout(new BorderLayout());
  Schneemann snow = new Schneemann( stg );
  getContentPane().add( snow, BorderLayout.CENTER );
  this.setSize(snow.getWidth(),snow.getHeight());
  this.setVisible(true);
 }
}

Andere Medien benötigen jeweils eigene Klassen. Zum Abspielen von Musik legen Sie eine neue Klasse Musik an. Am Anfang der Datei lesen Sie mit import-Anweisungen die Bibliotheken java.lang.*, java.net.* und java.applet.* ein. Der Konstruktor der Klasse übernimmt auch hier den Dateinamen des abzuspielenden Sounds. Dann erstellen Sie ein neues Objekt der Klasse AudioClip, das die Datei aus der Variablen stg übernimmt. Die Methode play sorgt für die Wiedergabe das Objekts.

public Musik(String file) {
 URL url = getClass().getResource(file);
 AudioClip audioClip = Applet.newAudioClip(url);
 audioClip.play();
}

Nun ist es möglich, in der Adventskalender-Klasse ein Objekt einer der beiden neuen Klassen zu erzeugen. Fügen Sie beim gewünschten Tag in den case-Block eine Zeile dieser Art ein:

new Bilder("bilddatei.jpg");
new Musik("musikdatei.wav");

Gedichte, Märchen, Rezepte

Als weiteres mögliches Anzeigemedium verwendet unser Adventskalender einfache Texte. Auch dazu benötigt es eine eigene Klasse, die ein neues Fenster zu Anzeige öffnet. Die neue Klasse Anzeigefenster benötigt die Bibliotheksteile javax.swing.*, java.io.*, java.awt.Color und java.net.*. Im Konstruktor vererben Sie ihr außerdem die Eigenschaften von JDialog über das Schlüsselwort extends. Er übernimmt eine Zeichenkette als Argument, die den Namen der Textdatei enthält.

Dann initialisieren Sie im Konstruktor zwei Hilfsvariablen line und text mit zunächst einer leeren Zeichenkette als Inhalt. In einem try-Block erstellen Sie einen Zeichenstrom (InputStream) in der Variablen is. Anschließend liest ein BufferedReader diese Zeichen in die Variable in ein.

Es folgt eine Schleife, die bis zum Ende des Textes alle Zeichen in der Zeichenkette text speichert, an jedem Zeilenende fügt sie den Code für den Zeilenumbruch \n ein. Der anschließende catch-Block gibt eine Fehlermeldung aus, wenn beim Lesen der Datei ein Fehler auftritt.

Die nachfolgenden Zeilen erstellen ein Textfenster, TextPanetext anzeigt. Im Gegensatz zum Textfeld aus der Abfrage des Tages, soll der Benutzer diesen Text nicht verändern, deshalb setzen Sie das Attribut setEditable auf false, für die Hintergrundfarbe sorgt setBackground. Die Funktion pack schließlich passt die Größe des Anzeigefensters an den Text an (Listing 3, Abbildung 8).

Listing 3

Das Haupt-Programm

public class Anzeigefenster extends JDialog {
 public Anzeigefenster(String str) {
  String line = "", text = "";
  try{
   InputStream is = getClass().getResourceAsStream(str);
   BufferedReader in = new BufferedReader(new InputStreamReader(is));
   while ((line = in.readLine()) != null) {
    text += line;
    text += "\n";
   }
   in.close();
  }
  catch(Exception e){
   JOptionPane.showMessageDialog(this, "Beim Öffnen der Datei ist ein Fehler aufgetreten.");
  }
  JTextPane pane = new JTextPane();
  pane.setText(text);
  pane.setEditable(false);
  pane.setBackground(new Color(247,202,209));
  getContentPane().add(pane);
  pack();
  this.setVisible(true);
 }
}

Abbildung 8: Ein Textfenster zur Ausgabe von Weihnachtsgedichten.

Abbildung 8: Ein Textfenster zur Ausgabe von Weihnachtsgedichten.

Objekte der Klasse Anzeigefenster lassen sich nun ebenfalls in einem case-Block der Klasse Adventskalender erzeugen, mit dem Namen der Textdatei als Paramater:

new Anzeigefenster("textdatei.txt");

Sind alle case-Blöcke gefüllt, ist das Programm fertig. Den kompletten Quelltext finden Sie auf der Heft-CD im Archiv src.tar.gz.

Ausführen und weitergeben

Um das Java-Programm auch anderen Nutzern zugänglich zu machen, kompilieren Sie es. Das bedeutet, es wird in Maschinensprache übersetzt und wird so mit der Java-Laufzeitumgebung (Java Runtime Environment, JRE) ausführbar.

Wechseln Sie auf der Kommandozeile ins Unterverzeichnis src im Projektordner, dort speichert NetBeans die erstellten Dateien ab. Das Programm javac, der Java-Compiler, liegt im Unterverzeichnis bin Ihrer JDK-Installation. Rufen Sie ihn aus dem src-Verzeichnis mit der entsprechenen Pfadangabe und folgenden Parametern auf:

javac -target 1.4 -source 1.4 Adventskalender.java

Die Paramater target 1.4 und source 1.4 sorgen für Abwärtskompatibilität. So können es auch Benutzer ausführen , die noch nicht die neueste Java-Version installiert haben.

Der Java-Compiler javac baut aus den java-Dateien class-Dateien. In einem jar-Archiv lassen sie sich zusammenfassen, damit Sie nur eine komprimierte Datei weiterzugeben brauchen. Um in einem solchen Archiv die Hauptklasse festzulegen, benötigen Sie eine so genannte Manifest-Datei, die diese Information enthält. In ihr steht nur eine Anweisung mit anschließender Leerzeile:

Main-Class: Adventskalender

Nun erstellen Sie das Archiv:

jar cmf manifestdatei Adventskalender.jar Adventskalender.class *

Hierbei weist das Argument cmf den Compiler an, eine jar-Datei mit der in der Manifest-Datei festgelegten Hauptklasse zu erstellen. Der Stern am Ende der Zeile sorgt dafür, dass das Archiv Adventskalender.jar neben der Hauptklasse Adventskalender.class auch alle anderen Dateien im Verzeichnis enthalten soll. Die fertige Datei lässt sich nun auf jedem Rechner mit Java 1.4 oder 5.0 mit java -jar Adventskalender.jar ausführen und liegt ebenfalls auf der Heft-CD.

Die Autorin

Frauke Oster lernt Java in Ihrem Studium der Angewandten Informatik und bedankt sich bei Ihrem Java-Professor für seine zahlreichen Tipps.

Glossar

Java

Eine objektorientierte Programmiersprache, die von der Firma Sun Microsystems im Jahr 1996 entwickelt wurde. Derzeit aktuell ist Version 5.0, inoffiziell firmiert sie auch unter 1.5.0

Entwicklungsumgebung

Ein “Integrated Development Environment” (IDE) vereinfacht Programmierern ihre Aufgabe. Durch das Hervorheben von Schlüsselwörtern gestaltet sie den Code übersichtlich, außerdem stellt sie Standardfunktionen per Mausklick bereit.

Klassen

Alle Objekte einer Klasse verfügen über gemeinsame Eigenschaften und Verhaltensweisen. Die Klasse stellt auch spezielle Funktionen (Methoden) für ihre Objekte bereit.

Konstruktor

Er initialisiert neue Objekte seiner Klasse. Enthält eine Klasse keinen Konstruktor ruft sie einen Standardkonstruktor auf, der keine Parameter übernimmt. Jeder Konstruktor heißt wie die Klasse, die ihn umgibt.

URL

Abkürzung für “Uniform Resource Locator”. Ein Format zur Beschreibung von Ressourcen, ob Dateien, Rechner oder E-Mail-Adressen. Eine Zeichenkette im URL-Format gibt am Anfang das verwendete Protokoll an, z. B. “http” für das WWW oder “file” für lokale Dateien und dahinter Pfadangabe oder Rechnername.

Infos

[1] Sun Java: http://java.sun.com

[2] NetBeans: http://www.netbeans.org/

LinuxUser 12/2004 KAUFEN
EINZELNE AUSGABE
ABONNEMENTS
TABLET & SMARTPHONE APPS
E-Mail Benachrichtigung
Benachrichtige mich zu:

Hinweis: Dieser Artikel ist älter als ein Jahr, enthaltene Informationen sind möglicherweise veraltet.

0 Kommentare
Älteste
Neuste Beste Bewertung
Inline Feedbacks
Alle Kommentare anzeigen
Nach oben