Bestand dialoog vensters
Even een tutorial over een nog vaak gevraagd, weinig begrepen, maar eigenlijk zeer eenvoudig onderdeel van een programma: een dialoog venster om bestanden te selecteren
Met behulp van een mooi dialoogvenster kan je op een eenvoudige manier bestanden laten kiezen door je gebruikers. Swing voorziet hiervoor een mooi exemplaar. In deze tutorial zal je leren hoe je deze kan gebruiken, zodat ook jouw programma's die extra professionele toets krijgen
Algemeen
We vallen meteen met de deur in huis door eens te bekijken hoe zo'n dialoogvenster er uitziet. Dit is afhankelijk van je gebruikte Look and Feel, maar ze bieden wel allemaal dezelfde functionaliteiten. Hier zijn enkele voorbeelden van hoe ze eruit zien:
Om zulke mooie dialogen te verkrijgen, moet je zeer weinig doen. Er is een component in Swing, genaamd JFileChooser, die dit alles voor je verzorgt. Het aanmaken verloopt zeer eenvoudig:
Code:
JFileChooser fc = new JFileChooser();
Dat is het! Nu moet je enkel nog het commando geven om de dialoog te tonen. Hiervoor kun je 1 van de volgende 3 methoden gebruiken:
Code:
int showDialog(Component parent, String approveButtonText)
int showOpenDialog(Component parent)
int showSaveDialog(Component parent)
Zoals je ziet geef je hieraan als 'parent' een component mee. Dit is een component van waaruit je je dialoog wenst op te roepen. Meestal is dit een venster (JFrame). Je hoeft hiervoor geen waarde door te geven, je kan gewoon null gebruiken ook, maar het heeft als voordeel dat je venster onbruikbaar wordt tot de gebruiker iets gekozen heeft en/of een bevestigingsknop gedrukt heeft op je dialoogvenster. Het OpenDialog dient voor wanneer je gebruiker een document wenst te openen. In de titel van je dialoogvenster zal dan een verwijzing staan naar 'openen', net als op de knop voor het bevestigen. (Analoog voor SaveDialog) Wat die tekst precies is zal afhangen van de gebruikte L&F, dus indien je hiermee niet tevreden bent, kun je zelf de bevestigingstekst instellen met de eerste van de 3 methoden. Je hebt reeds gezien hoe het resultaat eruit ziet bij de eerste 2 figuren in deze tutorial.
Indien de gebruiker iets gekozen heeft of je dialoog geannuleerd heeft keert de methode terug en kun je kijken wat de teruggestuurde int is. Deze geeft aan wat de gebruiker deed, en er zijn 3 mogelijke waarden:
- JFileChooser.CANCEL_OPTION
- JFileChooser.APPROVE_OPTION
- JFileCHooser.ERROR_OPTION
Op basis hiervan kun je dan controleren of een gebruiker iets heeft gekozen of gewoon geannuleerd heeft en zelfs of er een fout was opgetreden om een of andere reden:
Code:
int result = fc.showOpenDialog(null);
switch(result) {
case(JFileChooser.CANCEL_OPTION) ...
case(JFileChooser.APPROVE_OPTION) ...
case(JFileCHooser.ERROR_OPTION ) ...
};
Indien de gebruiker de APPROVE gekozen had, kun je met
Code:
fc.getSelectedFile();
opvragen wat het gekozen bestand/directory was.
We kunnen nu een mooie dialoog presenteren naar de gebruiker toe, maar vaak wil je nog een aantal zaken instellen. In wat volgt zullen we aantonen wat je nog meer kunt aan belangrijke functionaliteiten en hoe je dit doet.
Enkel directories selecteren
Dit kan zeer eenvoudig door volgende instelling te doen:
Code:
fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
Instellen van de directory
Je kunt in de constructor van de filechooser opgeven wat z'n pad is waarin hij zich voor het eerst toont. Maar je kan het ook achteraf nog instellen indien je de lege constructor gebruikt hebt, of wanneer je hem ergens anders wenst te herbruiken. Dit doe je heel eenvoudig als volgt:
Code:
fc.setCurrentDirectory(file_dir);
Waarin file_dir een File-object is dat een directory voorstelt.
Filteren op types
Je kan ervoor kiezen om enkele bestandstypes te filteren, zodat bijvoorbeeld enkel het bestandstpe van jouw toepassing kan gekozen worden.
Je maakt hiervoor een eigen klasse aan, waarin je overerft van javax.swing.filechooser.FileFilter. Deze moet 2 methoden bevatten: accept en getDescription. Accept zal een bestand krijgen van je FileChooser en je filter zal dan met true of false (een boolean dus) terugsturen of het mag weergegeven worden als keuze of niet. GetDescription zal gebruikt worden om een tekstvoorstelling weer te geven zoals hier:
De code hiervoor ziet er als volgt uit:
Code:
class HTMLFilter extends FileFilter {
public boolean accept(java.io.File file) {
String filename = file.getName();
return filename.endsWith(".html");
}
public String getDescription() {
return "Webpagina's (*.html)";
}
}
en je stelt deze filter in via:
Code:
fc.addChoosableFileFilter(new HTMLFilter());
Opvragen van het icoon van een bestand
Je kan je filechooser ook gebruiken als truuk om aan het icoon van een bepaald type bestand te geraken. Hiervoor gebruik je volgende code:
Code:
JFileChooser fc = new JFileChooser();
File file = new File("document.txt");
Icon icon = fc.getIcon(file);
Merk hierbij op dat je zelf geen showDialog moet gebruiken. Je kan dus eigenlijk de filechooser misbruiken om enkel aan die iconen te geraken

De geleverde iconen hangen ook wel af van de gebruikte L&F, dus test dit best eerst eens uit op de meest gangbare L&F's of minstens toch bij die die je wellicht zal laten gebruiken of die je vermeld als compatible met je GUI.
Voorbeeld
Een voorbeeld waarin zo goed als al deze functionaliteiten worden uiteengezet is het volgende:
Code:
import javax.swing.*;
import javax.swing.filechooser.FileFilter;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class FileChooserDemo extends JFrame implements ActionListener{
private JTextField textfield;
private JButton save;
private JButton open;
private JFileChooser fc;
public FileChooserDemo() {
super("Demo filechooser");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
initGUI();
this.setSize(200,140);
this.setVisible(true);
}
private void initGUI() {
textfield = new JTextField();
fc = new JFileChooser();
fc.addChoosableFileFilter(new HTMLFilter());
save = new JButton("Save...");
save.addActionListener(this);
open = new JButton("Open...");
open.addActionListener(this);
JPanel paneel = new JPanel(new GridLayout(3,1));
paneel.add(save);
paneel.add(open);
paneel.add(textfield);
this.setContentPane(paneel);
}
public static void main(String[] args) {
new FileChooserDemo();
}
public void actionPerformed(ActionEvent ae) {
Object source = ae.getSource();
int ret=0;
if(source == save) {
ret = fc.showSaveDialog(this);
}else if(source == open) {
ret = fc.showOpenDialog(this);
}else {
return;
}
if(ret==JFileChooser.APPROVE_OPTION) {
textfield.setText(fc.getSelectedFile().toString());
}
else {
textfield.setText("U annuleerde");
}
}
}
class HTMLFilter extends FileFilter {
public boolean accept(java.io.File file) {
String filename = file.getName();
return filename.endsWith(".html");
}
public String getDescription() {
return "Webpagina's (*.html)";
}
}
Het bestand is ook te downloaden als bijlage:
FileChooserDemo.txt (Grootte: 1,73 KB / Aantal keer gedownload: 8)
(Even hernoemen naar .java en dan compileren

)
Als er nog verdere functies willen benadrukt of uitgelegd worden, zeg het gerust en ik plaats ze er nog bij of ik vul de reeds gegeven uitleg graag nog aan met verdere uitleg