Wie lässt sich ein einfacher Speichern unter...-Dialog realisieren? v.1.61

Java stellt mit seiner Klasse JFileChooser einen einfach zu handhabenden Dialog bereit, mit dem auf die bekannte Art und Weise Dateien gespeichert werden können.

Das Beispiel deklariert eine von JFrame abgeleitete Oberfläche mit einem Button, der auf Klick einen Speichern-Dialog öffnet. Nach Auswahl des gewünschten Verzeichnisses und Eingabe des Dateinamens wird dieser mit einer Nachricht auf die Konsole ausgegeben. Die Nachricht gibt an, ob der (fiktive) Dateityp zulässig ist oder nicht.

Im Konstruktor der Klasse wird im ActionListener des Buttons die Methode saveAs() aufgerufen. Als Parameter wird als Pfad zum Speicherverzeichnis null übergeben, was bewirkt, dass das Heimatverzeichnis des Users beim Öffnen des Dialoges angezeigt wird. Selbstverständlich kann hier jeder bliebige Pfad eingesetzt werden. Ist der übergebene Pfad ungültig, so wird ebenfalls der Heimatpfad des Users verwendet.
In der Methodendeklaration wird als erstes ein Objekt eines JFileChooser erzeugt, dem der o.a. Pfad übergeben wird. Als nächstes wird der Typ des gewünschen Datei-Auswahl-Dialogs festgelegt. Hier kann zwischen den statischen int-Werten OPEN_DIALOG und SAVE_DIALOG gewählt werden. Die folgenden Zeilen demonstrieren die Anwendung von zwei FileNameExtensionFilter . Die Klasse wurde erst in der Java-Version 1.6 eingeführt. Soll das Beispiel mit einer älteren Java-Version kompatibel sein, muss diese Passage einschließlich der if-Verzweigung zur Ausgabe weiter unten entfernt oder auskommentiert werden.
Der Konstruktor des Filters demonstriert die Syntax einer variablen Parameterzahl: Er erwartet eine beliebige Reihe von String-Werten, von denen der erste den Text der Dateityp-Auswahl des Dialoges darstellt. Die folgenden müssen Datei-Extensionen entsprechen, die die erlaubten Ziel-Dateitypen kennzeichnen. Nachdem wahlweise durch den Aufruf von removeChoosableFileFilter(chooser.getAcceptAllFileFilter()) der Eintrag Alle Dateien entfernt wurde, werden die neu erzeugten Filter mit dem Dialog verknüpft. Mit dem Setzen eines Titels und der Sichtbarschaltung ist die Konstruktion des Dialogs abgeschlossen.

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;

import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.filechooser.FileNameExtensionFilter;

public class SpeichernUnterClass extends JFrame {

    public SpeichernUnterClass() {
        JButton butt = new JButton("Speichern unter...");
        butt.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                saveAs(null);
            }
        });
        this.add(butt, BorderLayout.SOUTH);

        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setSize(400, 300);
        this.setLocationRelativeTo(null);
        this.setTitle("Speichern unter Demo");
        this.setVisible(true);
    }

    boolean saveAs(String pfad) {

        JFileChooser chooser;
        if (pfad == null)
            pfad = System.getProperty("user.home");
        File file = new File(pfad.trim());

        chooser = new JFileChooser(pfad);
        chooser.setDialogType(JFileChooser.SAVE_DIALOG);
        FileNameExtensionFilter plainFilter = new FileNameExtensionFilter(
                "Plaintext: txt, csv", "txt", "csv");
        FileNameExtensionFilter markUpFilter = new FileNameExtensionFilter(
                "Markup: xml, htm, html", "xml", "html", "htm");
        chooser.removeChoosableFileFilter(chooser.getAcceptAllFileFilter());
        chooser.setFileFilter(plainFilter);
        chooser.setFileFilter(markUpFilter);
        chooser.setDialogTitle("Speichern unter...");
        chooser.setVisible(true);

        int result = chooser.showSaveDialog(this);

        if (result == JFileChooser.APPROVE_OPTION) {

            pfad = chooser.getSelectedFile().toString();
            file = new File(pfad);
            if (plainFilter.accept(file) || markUpFilter.accept(file))
                System.out.println(pfad + " kann gespeichert werden.");
            else
                System.out.println(pfad + " ist der falsche Dateityp.");

            chooser.setVisible(false);
            return true;
        }
        chooser.setVisible(false);
        return false;
    }

    public static void main(String[] args) {
        new SpeichernUnterClass();
    }
}

Die im Quelltext folgenden Zeilen regeln das Verhalten des Dialogs: Bei Betätigen eines Buttons liefert der Dialog einen int-Wert. Je nach betätigtem Button werden unterschiedliche Werte zurück gegeben, für die eigene Reaktionen definiert werden können.
Der in JFileChooser.APPROVE_OPTION gespeicherte Wert repräsentiert die Rückgabe des betätigten OK-Buttons. Hier muss das Abspeichern einer Datei implementiert werden. Zur Demonstration werden an dieser Stelle nur die oben bereits erwähnten Texte ausgegeben. Bevor dies geschehen kann, wird der in den Dialog eingegebene Dateiname nach Bilden von entsprechenden File-Objekten gegen die Filefilter geprüft.
Schließlich wird der Dialog unsichtbar gesetzt und - je nach betätigtem Button - true bei Erfolg oder false zurück gegeben.

1) Die Verwendung der Klasse javax.swing.filechooser.FileNameExtensionFilter verlangt Java 1.6.