8.5.9 | JFileChooser |
Über den JFileChooser können Dateien ausgewählt werden.
Welche Dateien dabei angezeigt und ausgewählt werden können, wird durch drei Ebenen definiert:
Internes Filtern Über die Methoden setFileHidingEnabled(false) ändert man die Standardeinstellung, versteckte Dateien (bspw. Dateien, deren Name auf Unix mit einem Punkt anfangen) nicht anzuzeigen. Applikationsweites Filtern Die Methode setFileFilter(FileFilter filter) bietet die Möglichkeit, einen eigenen Filter mit der setzen. Dieser Filter ist damit der Standard-Filter, der sofort die Dateien filtert. Zudem wird er zur Liste der auswählbaren Filter hinzugefügt. Benutzerauswählbare Filter Wenn mit der Methode addChoosableFileFilter() mehrere Filter zur Auswahl bereitgestellt werden, kann der Benutzer einen davon wählen und bekommt dementsprechend nur die dort zulässigen Dateien zu sehen.
Die Grundeinstellung des JFileChoosers hat bereits einen ChooseableFileFilter, der alle Dateien auswählbar macht. Möchte man also die Auswahl unbedingt einschränken, muss man diesen mittelsremoveChoosableFileFilter( fileChooser.getChoosableFileFilters()[0]);entfernen. Seit der Java Version1.3 kann dazu die Methode setAcceptAllFileFilterUsed(boolean flag) verwendet werden.
Beim Schreiben eines eigenen Filters ist darauf zu achten, dass die FileFilter Verzeichnisse annehmen, da sonst nur Dateien, aber keine Unterordner des Startordners auswählbar sind:
class GIFFilter implements javax.swing.filechooser.FileFilter { public boolean accept(File f) { // Auch Unterverzeichnisse anzeigen if (f.isDirectory()) return true; return f.getName().toLowerCase().endsWith(".gif"); } public String getDescription() { return "GIFs"; } }Über die Methode setSelectionMode(int mode) kann eingestellt werden, dass nur Dateien (JFileChooser.FILES_ONLY), nur Verzeichnisse (JFileChooser.DIRECTORIES_ONLY) oder Dateien und Verzeichnisse (JFileChooser.FILES_AND_DIRECTORIES) ausgewählt werden können.
Hat der Benutzer eine oder mehrere Dateien über die Methode setMultiSelectionEnabled(boolean false) ausgewählt, kann der Programmierer auf diese mittels getSelectedFile() bzw. getSelectedFiles() zugreifen.
Zur Anzeige wird der JFileChooser über eine der drei Methoden
public int showDialog(Component parent, String approveButtonText) public int showOpenDialog(Component parent) public int showSaveDialog(Component parent)
Das Ergebnis des Aufrufes ist eine der folgenden Konstanten:
- JFileChooser.CANCEL_OPTION
Der Vorgang wurde durch den Benutzer abgebrochen.- JFileChooser.APPROVE_OPTION
Der Vorgang wurde durch den Benutzer erfolgreich abgeschlossen und eine oder mehrere Dateien ausgewählt.- JFileCHooser.ERROR_OPTION
Ein Fehler ist passiert und der Dialog wurde beendet.Um das Aussehen zu ändern, kann man eine eigene Komponente an der rechten Seite anzeigen (typischerweise eine Preview-Komponente).
Dies geschieht über die Methode setAccessory(JComponent comp). Eine Preview-Komponente könnte sich so als PropertyChangeListener bei dem JFileChooser registrieren und bei einem JFileChooser.SELECTED_FILE_CHANGED_PROPERTY-Event die selektierte Datei (PropertyEvent.getNewValue()) als kleines Bild darstellen.
Wie eine Datei im JFileChoser angezeigt wird, bestimmt zunächst die javax.swing.filechooser.FileSystemView. Diese Klasse wird dabei vom Look-and-Feel gesetzt und liefert beispielsweise, welches Icon in der Dateiliste für bestimmte Dateien angezeigt werden soll. Diese Standard-Einstellungen können aber mit einem angepassten javax.swing.filechooser.FileView-Objekt überschrieben werden. Das FileView-Objekt kann mithilfe der Methode setFileView(FileView view) gesetzt werden.
Wenn eine Methode dieses FileView einen null-Wert zurückliefert, wird die gleiche Methode im FileSystemView aufgerufen, die dann den Standard-Wert liefert. Dadurch ist eine FileView als Erweiterungen anzusehen, in der man nur die zusätzlichen Informationen zurückliefern muss.
JFileChooser chooser = new JFileChooser(); chooser.addChoosableFileFilter(new FileFilter() { public boolean accept(File f) { if (f.isDirectory()) return true; return f.getName().toLowerCase().endsWith(".gif"); } public String getDescription () { return "GIFs"; } }); chooser.setMultiSelectionEnabled(false); if (chooser.showOpenDialog(frame) == JFileChooser.APPROVE_OPTION) System.out.println ("Datei "+chooser.getSelectedFile()+ " ausgewählt.");