Question

J'ai un JDialog avec un bouton / TextField pour l'utilisateur de sélectionner un fichier. Voici le code:

FileDialog chooser = new FileDialog(this, "Save As", FileDialog.SAVE );
String startDir = saveAsField.getText().substring( 0, saveAsField.getText().lastIndexOf('\\') );
chooser.setDirectory(startDir);
chooser.setVisible(true);
String fileName = chooser.getFile();

Mon problème est qu'au lieu de voir un filtre tous les fichiers, je veux fournir un filtre personnalisé, par exemple pour docs ou quelque chose Word. Je configurer un FilenameFilter personnalisé à l'aide setFilenameFilter (), mais il ne semble pas fonctionner. J'ai remarqué qu'il dit dans les documents que le filtre personnalisé ne fonctionne pas sous Windows (ce fonctionne sous Windows XP / Vista / 7). Il y avait là ma mise en œuvre du filtre:

chooser.setFilenameFilter( new geFilter() );
public class geFilter implements FilenameFilter {
    public boolean accept(File dir, String name) {
        return name.endsWith( ".doc" ) || name.endsWith( ".docx" );
    }
}

Est-ce que je fais quelque chose de mal ici? De plus, je veux une description apparaisse dans la boîte, comme « Microsoft Word (* .doc * .docx) » mais je ne suis pas sûr de savoir comment faire.

Toute aide est appréciée.

Était-ce utile?

La solution

AWT est pas vraiment le meilleur moyen d'écrire une interface graphique Java applications ces jours-ci. Sun semble avoir abandonné la plupart du temps. Les deux options les plus populaires sont swing et SWT . Je pense donc qu'ils ne développent pas vraiment les API très largement d'ajouter des fonctionnalités modernes. (Err, pour répondre à votre question: Non, vous ne semblez pas être en mesure de le faire avec AWT)

a l'avantage swing qu'il est en écriture une fois la gestion partout vraiment et il peut regarder exactement la même chose partout. Il y a Look & Feels qui tentent de rendre natif look Swing, certains sont meilleurs que d'autres (Mac est pas terrible, Windows est correct, GTK est pas). Pourtant, si vous voulez une application qui ressemble vraiment et agit EXACTEMENT les mêmes partout, Swing vous permettra de le faire. De plus, il court hors-the-box sans bibliothèques supplémentaires. La performance est pas grande.

JFileChooser laissera tu fais ce que tu veux. Créer une sous-classe de FileFilter et appeler setFileFilter sur le JFileChooser.

SWT prend l'écriture une fois la gestion partout à l'extrême opposé. Vous avez encore une base de code que vous écrivez contre, mais il utilise en fait les widgets natifs sur chaque plate-forme il ressemble généralement à une application native (pas partout parfait, mais toujours impressionnant). Il est rapide et assez fiable dans mon expérience. Eclipse (et d'autres logiciels de haut niveau) utilise SWT il est utilisé assez lourd. Mais il ne nécessite JARs spécifiques à la plateforme et DLLs.

Autres conseils

puisque vous utilisez JDialog, qui est une classe swing pourquoi ne pas utiliser JFileChooser ?

 JFileChooser fc = new JFileChooser("C:\\");
 fc.setFileFilter(new FileNameExtensionFilter("Microsoft Word (*.doc, *.docx)", "doc", "docx"));

FileNameExtensionFilter est une belle Java 6 classe qui fait exactement ce que vous voulez.

Je suis également en train de le faire. Je veux utiliser FileDialog au lieu de JFileChooser.

J'ai trouvé la réponse ici: http://www.rgagnon.com/javadetails/ java-0247.html

Il dit que « sur la plate-forme Win, la méthode setFilenameFilter ne fonctionne pas. Il faut utiliser la méthode setFile au lieu de définir un filtre. »

Il y a le code source à l'adresse indiquée.

Je l'ai testé et il fonctionne:

FileDialog fd = new FileDialog((Frame) null, "Save File", FileDialog.SAVE);
fd.setFile("*.txt");
fd.setVisible(true);

String file = fd.getFile();
System.out.println(file);
System.exit(0);

Vous pouvez appeler Windows fileDialog (CFileDialog) natif avec JNI. Les filtres peuvent être définis pour CFileDialog facilement.

J'ai écrit une classe simple wrapper pour CFileDialog il y a plusieurs mois, Si vous êtes intéressé, vous pouvez obtenir la source et binaire de

projet Xfiledialog sur le code google

Si jamais vous utilisez JavaFX 2 , runtime JavaFX .

Exemple:

    FileChooser fc = new FileChooser();
    FileChooser.ExtensionFilter filter;
    filter = new FileChooser.ExtensionFilter("Text files (*.txt)", "*.txt");
    fc.getExtensionFilters().add(filter);
    File f = fc.showOpenDialog(primaryStage);
    System.out.println(f);

Il suffit d'utiliser la méthode de setFilenameFilter de l'instance FileDialog fd:

            fd.setFilenameFilter(new FilenameFilter()
                            {
                                @Override
                                public boolean accept(File file, String s)
                                {
                                    // enter code to return TRUE or FALSE here
                                    return s.contains(".txt");
                                }
                            });
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top