Frage

Ich habe eine JDialog mit einem Knopf / Textfeld für den Benutzer eine Datei auszuwählen. Hier ist der 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();

Mein Problem ist, dass stattdessen ein All Files Filter zu sehen, möchte ich einen benutzerdefinierten Filter zur Verfügung zu stellen, zum Beispiel für Word-Dokumente oder so etwas. Ich Setup ein benutzerdefinierten Filenamen mit setFilenameFilter (), aber es schien nicht zu arbeiten. Ich habe bemerkt, dass es in der Dokumentation sagt, dass der benutzerdefinierte Filter nicht in Windows funktioniert (dies läuft unter Windows XP / Vista / 7). Hier war meine Implementierung des Filters:

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

Mache ich etwas falsch hier? Außerdem möchte ich eine Beschreibung in der Box erscheinen, wie „Microsoft Word (* .doc * .docx)“ aber ich bin nicht sicher, wie das zu tun.

Jedwedes Hilfe ist willkommen.

War es hilfreich?

Lösung

ist AWT nicht wirklich die bevorzugte Art und Weise Java-GUI des Schreibens in diesen Tagen apps. Sun scheint es meist aufgegeben zu haben. Die beiden beliebtesten Optionen sind Schaukel und SWT . Also ich denke, dass sie nicht wirklich die APIs entwickeln sich sehr ausführlich modernen Funktionen hinzuzufügen. (Err, Ihre Frage zu beantworten: Nein, Sie scheinen nicht in der Lage zu sein, das zu tun mit AWT)

Schaukel hat den Vorteil, dass es wirklich ist einmal schreibLauf überall und es kann genau überall gleich aussehen. Es gibt Look & Feels versuchen, dass Swing-Look heimisch zu machen, einige sind besser als andere (Mac nicht schrecklich, Windows ist in Ordnung, ist GTK nicht). Dennoch, wenn Sie eine App wollen, die wirklich genau überall gleich aussieht und wirkt, Schaukel lassen Sie das tun. Außerdem läuft es out-of-the-Box ohne zusätzliche Bibliotheken. Die Leistung ist nicht groß.

Swing JFileChooser lassen Sie tun, was Sie wollen. Erstellen Sie eine Unterklasse von Filefilter und rufen setFileFilter auf dem JFileChooser.

SWT führt die write-once-run-überall in anderen Extrem. Sie haben noch eine Code-Basis, die Sie gegen schreiben, aber es tatsächlich nutzt die nativen Widgets auf jeder Plattform, so dass es wie eine native App sieht im Allgemeinen (nicht überall perfekt, aber immer noch beeindruckend). Es ist schnell und ziemlich zuverlässig in meiner Erfahrung. Eclipse (und andere High-Profile-Software) verwendet SWT, so dass es in ziemlich schweren Einsatz ist. Aber es erfordert plattformspezifische JAR-Dateien und DLLs.

Andere Tipps

da Sie JDialog verwenden, das ist eine Swing-Klasse warum nicht einen href mit <= „http://java.sun.com/javase/6/docs/api/javax/swing/JFileChooser.html“ rel = "noreferrer"> JFileChooser ?

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

FileNameExtensionFilter ist ein schönes Java 6 Klasse, das tut genau das, was Sie wollen.

Ich versuche auch, das zu tun. Ich mag File-Dialog statt JFileChooser verwenden.

Ich fand die Antwort hier: http://www.rgagnon.com/javadetails/ java-0247.html

Er sagt, dass „auf der Win-Plattform, die setFilenameFilter Methode nicht funktionieren. Wir haben die setFile Methode verwenden, müssen stattdessen einen Filter zu setzen.“

Es gibt Quellcode an dem angegebenen Link.

I getestet und es funktioniert:

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);

Sie können den native Windows-File-Dialog (CFileDialog) mit JNI nennen. Filter können für CFileDialog leicht eingestellt werden.

Ich schrieb eine einfache Wrapper-Klasse für CFileDialog vor einigen Monaten, wenn Sie interessiert sind, können Sie die Quelle und die binären von

erhalten

Xfiledialog Projekt auf Google Code

Wenn Sie jemals benutzen JavaFX 2 , die JavaFX Runtime .

Beispiel:

    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);

Just setFilenameFilter Methode der FileDialog Instanz fd verwenden:

            fd.setFilenameFilter(new FilenameFilter()
                            {
                                @Override
                                public boolean accept(File file, String s)
                                {
                                    // enter code to return TRUE or FALSE here
                                    return s.contains(".txt");
                                }
                            });
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top