void DateiEnde_actionPerformed(ActionEvent e) {
System.exit(0);
}
Mit der Methode dispose() (beseitigen) laesst sich ein Fenster loeschen.
Übung:Benutzen Sie die Methode dispose() um den Abbrechen-Knopf des Eingabe-Fensters mit einer Aktion zu verbinden, die das Eingabe-Fenster beseitigt. (Tipp: Machen Sie dies aehnlich wie bei dem "Beenden"-Menue. )
CD newAlbum=new CD();
newAlbum.setTitel("Mensch");
CDContainer.getInstance().addCD(newAlbum);
In den ersten beiden Zeilen wird eine CD angelegt und das Attribut geaendert. Danach wird die CD mit CDContainer.getInstance().addCD(newAlbum);in die Sammelung aufgenommen.
Übung: Das Eingabe-Fenster aendert die Attribute
einer neu angelegten CD. Fuegen Sie diese CD dem Container hinzu. (Hinweis: Die Variable der neu angelegten CD heisst in der Mini-Verwalung nicht newAlbum.)
Fuer Testzwecke ist in der Klasse CDContainer.java die Methode TestAusgabe() programmiert, welche alle Titel der CDs in der Sammliung auf dem Bildschirm ausgibt. Damit sie sehen, dass die CDs der Sammlung hinzugefuegt wurde, lassen Sie sich an der Stelle wo Sie die CD dem Container hinzufuegen die Sammlung mit dem folgenden Befehl ausgeben:
CDContainer.getInstance().TestAusgabe();Hinweis: Fuegen Sie ihrem Eingabe-Fenster-Objekt eine Moeglichkeit hinzu, die es erlaubt abzufragen, ob der OK-Button gedrueckt worden ist. In Abhaengigkeit davon koennen Sie dann in der Anwendung die CD hinzufuegen oder nicht. Das ist am einfachsten in der Klasse CDInputDialog.java durch hinzufuegen des Attributs okstatus und der Methode getOKstatus(),die den Status zurueckliefert, zu machen:
boolean okstatus = true;
boolean getOKstatus()
{
return okstatus;
}
Übung: An welcher Stelle sollte man das Attribut okstatus auf false setzen ?
CDContainer.getInstance().getCDNumber();Übung: Aendern Sie das Tabellenmodell so, dass die Zeilenzahl der Tabelle dem Wert der bisher gespeicherten CDs entspricht. (Sie sehen, dass die Tabelle aber leider nicht laenger wird, wenn man eine CD hinzugefuegt hat.) Damit die Tabelle auch aktualisiert wird, muss man der Tabelle mitteilen, das sich etwas an ihr geaendert hat. Dazu dient die Klasse TableModelEvent, die Sie im folgenden speziell an der MiniCD-Verwaltung kennenlernen sollen: Zunaechst muss die Klasse TableModelEvent in der Anwendung (CDAnwendung.java) importiert werden:
import javax.swing.event.TableModelEvent;Der Anwendung (CDAnwendung.java) sollte ein weiteres Attribut hinzugefuegt werden:
TableModelEvent mytme;Wenn Ihre Anwendung startet ( hier in jbInit()) muessen Sie das Tabellen-Modell mit dem Tabellen-Ereignis verknuepfen, damit man der Tabelle eine Aenderung mitteilen kann. Das geht hier mit der Befehlszeile:
mytme = new TableModelEvent(unserTabellenModell);An der Stelle, wo sich die die Tabelle aendern soll, koennen Sie der Tabelle mitteilen, dass sich die Tabelle geaendert hat. Sie zeichnet sich darauf hin neu. Das wird in unserem Beispiel mit dem folgenden Befehl gemacht:
CDTabelle.tableChanged(mytme);Übung: Fuegen Sie die das Attribut TableModelEvent mytme; der Anwendung hinzu und teilen Sie Ihrer Tabelle mit (CDTabelle.tableChanged(mytme);), dass sie sich neu zeichnen soll, wenn dem Container eine CD hinzugefuegt wurde. Übung: Aendern Sie Ihr Tabellenmodell so, dass in der Tabelle die Titel der CDs erscheinen. Kleine Hilfe: Zunaechst muess in der Methode getValueAt(int row, int col) die CD an der Stelle row aus dem Container geholt werden:
CD theCD = CDContainer.getInstance().getCD(row);Dann koennen Sie die den Titel der CD bestimmen und zurueckliefern:
return theCD.getTitel();
import java.io.*;
void speichern(String filename)
{
try {
//Filenamen setzen
FileOutputStream fs = new FileOutputStream(filename);
ObjectOutputStream os = new ObjectOutputStream(fs);
// Das Objekt lnkCD (den Vektor) auf die Platte schreiben
os.writeObject(lnkCD);
os.close();
}
catch (IOException exc) {
System.err.println(exc.toString());
}
}
void laden(String filename)
{
try {
// Filnamen festlegen
FileInputStream fs = new FileInputStream(filename);
ObjectInputStream is = new ObjectInputStream(fs);
// Das eingelesene Objekt ist der Vector, der alle gespeicherten CDs enthaelt.
lnkCD=(Vector)is.readObject();
is.close();
}
catch (ClassNotFoundException e) {
System.err.println(e.toString());
}
catch (IOException exc) {
System.err.println(exc.toString());
}
}
Nebenbemerkung: Die sogenannten try-catch-Bloecke dienen der Behandlung von evtl. auftretenden Fehlern bei der Ein- oder Ausgabe.
Übung: Erweitern Sie die Klasse CDContainer.java um die Methoden speichern() und laden().
Die neu eingefuegten Methoden lassen sich wie folgt in der Anwendung (CDAnwendung.java) benutzen:
Speichern aller CDs in die Datei "daten.ser" , die in (dem Vektor) der Container-Klasse vorhanden sind:
CDContainer.getInstance().speichern("daten.ser");
Laden der CDs, die in der Datei "daten.ser" gespeichert sind:
CDContainer.getInstance().laden("daten.ser");
Übung: Fuegen Sie der Mini-Verwalung die Menue-Punkte Oeffnen und Speichern hinzu.
Verknuepfen Sie die Menuepunkte mit den Methoden laden und speichern. Fangen Sie zunaechst mit dem Speichern an.
Um den Speichern-Dialog muss sich sich der Programmierer, wenn er einmal weiss wie es geht, keine grossen Gedanken machen. Java stellt dafuer eine eigene FileDialog-Klasse zur Verfuegung. Es reicht im Wesentlichen zu wissen, dass es diese Klasse gibt und das man nach dem Aufruf des Dialoges den Dateinamen und das Verzeichnis als String erhalten kann.
Übung: Fuegen Sie Ihrer Anwendungs-Klasse das folgende Attribut mit dem Namen saveFileDialog hinzu:
private FileDialog saveFileDialog = new FileDialog(this, "Datei speichern", FileDialog.SAVE);
Dem Dialog wird hier mit der Variablen FileDialog.SAVE mitgeteilt, dass es sich um ein Speichern-Dialog handelt. Der Rahmen-Text des Fensters wird "Datei speichern". Weitere Informationen zu der Klasse FileDialog finden Sie auch in der Sun Dokumentation der Klasse FileDialog .
In der Loesung der Mini-CD-Verwaltung des letzten Termins wurde mit Hilfe der folgenden Befehlszeile der Inhalt des CD-Containers unter dem Namen "daten.ser" gespeichert:
CDContainer.getInstance().speichern("daten.ser");
Übung: Ergaenzen Sie die Methode, die Sie beim Abspeichern aufrufen, um den Aufruf des File-Dialogs. Dazu muessen Sie den File-Dialog mit der Methode show() der Klasse FileDialog sichtbar machen:
saveFileDialog.show();
Um die Datei nun auch unter einem neuen Namen zu speichern, muesssen aus dem Filedialog der Name der Datei und der Pfad ausgelesen werden. Dazu gibt es die Methoden getFile() und getDirectory()in der Klasse FileDialog.
Übung: Ergaenzen Sie Ihre Speichern-Methode, durch die folgenden Zeilen, die es ermoeglichen den eingegebenen Filenamen und das Verzeichnis als String zu erhalten:
String filename = saveFileDialog.getFile(); String directoryname = saveFileDialog.getDirectory();
Übung: Aendern Sie den Aufruf zum Abspeichern () , so dass das File unter dem eingegebenem Namen abgespeichert wird.
Hinweis: Strings koennen durch "+" aneinandergehaengt werden:
"Hallo"+"Welt" = "Hallo Welt"
Übung: Fuegen Sie einen Oeffnen-Dialog in Ihr Programm ein. (Das funktioniert analog zu dem Speichen-Dialog)
Zusaetzliches Attribut:
private FileDialog openFileDialog = new FileDialog(this, "Datei öffnen", FileDialog.LOAD);Sichtbar machen des Dialogs:
openFileDialog.show();Bestimmen des Gewaehlten Dateinamens und Verzeichnisses:
String file = openFileDialog.getFile(); String directory = openFileDialog.getDirectory();