Domanda

Ho un JDialog con un pulsante / campo di testo per l'utente di selezionare un file. Ecco il codice:

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

Il mio problema è che invece di vedere un filtro di tutti i file, voglio fornire un filtro personalizzato, ad esempio, per documenti Word o qualcosa del genere. I ha installato una consuetudine FilenameFilter utilizzando setFilenameFilter (), ma non sembra funzionare. Ho notato che si dice nella documentazione che il filtro personalizzato non funziona in Windows (questo viene eseguito in Windows XP / Vista / 7). Qui era mia implementazione del filtro:

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

Sto facendo qualcosa di sbagliato qui? Inoltre, voglio una descrizione appaia nel box, come "Microsoft Word (* .doc * .docx)", ma non sono sicuro di come fare.

Qualsiasi aiuto è apprezzato.

È stato utile?

Soluzione

AWT non è davvero il modo preferito di scrittura Java GUI applicazioni in questi giorni. Sun sembra aver in gran parte abbandonata. Le due opzioni più popolari sono swing e SWT . Quindi penso che in realtà non si sviluppano le API molto ampiamente per aggiungere caratteristiche moderne. (Err, per rispondere alla tua domanda: No, non sembrano essere in grado di farlo con AWT)

Altalena ha il vantaggio che è veramente write-once-run-ovunque e si può guardare esattamente la stessa ovunque. Ci sono Look & percepita che cercano di rendere swing aspetto nativo, alcuni sono migliori di altri (Mac non è terribile, Windows è ok, GTK non lo è). Eppure, se si vuole un app che sembra davvero e si comporta esattamente la stessa ovunque, Altalena ti consente di fare questo. Inoltre funziona out-of-the-box, senza librerie extra. Le prestazioni non è grande.

JFileChooser permette fai quello che vuoi. Creare una sottoclasse di FileFilter e chiamare setFileFilter sul JFileChooser.

SWT prende il write-once-run-ovunque all'estremo opposto. Hai ancora una base di codice che si scrive contro, ma lo utilizza widget nativi su ogni piattaforma in modo che appaia in generale come un'applicazione nativa (non perfetto ovunque, ma ancora impressionante). E 'veloce e abbastanza affidabile nella mia esperienza. Eclipse (e altri software di alto profilo) utilizza SWT quindi è in uso piuttosto pesante. Ma richiede JAR e DLL specifiche della piattaforma.

Altri suggerimenti

dal momento che si sta utilizzando JDialog, che è una classe altalena perché non utilizzare JFileChooser ?

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

FileNameExtensionFilter è un bel Java 6 di classe che fa esattamente quello che vuoi.

Sto anche cercando di farlo. Voglio usare FileDialog invece di JFileChooser.

ho trovato qui la risposta: http://www.rgagnon.com/javadetails/ java-0247.html

Si dice che "sulla piattaforma Windows, il metodo setFilenameFilter non funzionano. Dobbiamo usare il metodo SetFile invece di impostare un filtro".

Non c'è il codice sorgente al link indicato.

Ho provato e funziona:

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

È possibile chiamare il nativo di Windows FileDialog (CFileDialog) con JNI. I filtri possono essere impostati per CFileDialog facilmente.

Ho scritto una semplice classe wrapper per CFileDialog diversi mesi fa, se siete interessati, è possibile ottenere la fonte e binari da

progetto Xfiledialog su Google Code

Se si utilizza mai JavaFX 2 , il FileChooser classe farà esattamente ciò che serve senza che nessuno dei problemi JFileChooser / FileDialog. È anche possibile incorporare JavaFX 2 componenti al suo interno applicazioni Swing, ma è necessario JavaFX runtime .

Esempio:

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

Basta usare il metodo setFilenameFilter del FileDialog istanza 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");
                                }
                            });
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top