Pregunta

Tengo un JDialog con un botón / campo de texto para que el usuario seleccione un archivo. Aquí está el código:

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

Mi problema es que en lugar de ver un filtro de todos los archivos, quiero proveer un filtro personalizado, por ejemplo, para documentos de Word o algo así. I fijó una costumbre FilenameFilter usando setFilenameFilter (), pero no parece funcionar. Me di cuenta de que dice en la documentación que el filtro personalizado no funciona en Windows (esto se ejecuta en Windows XP / Vista / 7). Aquí estaba mi implementación 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" );
    }
}

¿Estoy haciendo algo mal aquí? Además, quiero una descripción que aparece en el cuadro, como "Microsoft Word (* .doc * .docx)", pero no estoy seguro de cómo hacerlo.

Cualquier y toda ayuda es apreciada.

¿Fue útil?

Solución

AWT no es realmente la mejor forma de escribir aplicaciones Java GUI estos días. Sun parece haber abandonado su mayoría. Las dos opciones más populares son Swing y SWT . Así que creo que en realidad no se desarrollan las API muy ampliamente para añadir características modernas. (Err, para responder a su pregunta: No, no parecen ser capaces de hacer eso con AWT)

Oscilación tiene la ventaja de que es verdaderamente de una sola escritura-gestión en cualquier lugar y puede ser exactamente el mismo en todas partes. Hay Look & Feels que tratan de hacer ver oscilación nativa, algunos son mejores que otros (Mac no es terrible, Windows está bien, no es GTK). Sin embargo, si quieres una aplicación que realmente se ve y actúa exactamente igual en todas partes, Swing le permitirá hacer eso. Además de que se ejecuta fuera de la caja sin ningún tipo de bibliotecas adicionales. El rendimiento no es muy grande.

JFileChooser le permitirá haces lo que quieres. Crear una subclase de FileFilter y llamar a setFileFilter en el JFileChooser.

SWT la toma de una sola escritura de gestión en cualquier lugar en el extremo opuesto. Todavía tiene una base de código que se escribe en contra, pero en realidad se utiliza el widgets nativos en cada plataforma por lo general se ve como una aplicación nativa (no es perfecto en todas partes, pero sigue siendo impresionante). Es rápido y muy fiable en mi experiencia. Eclipse (y otro software de alto perfil) utiliza SWT por lo que es bastante pesado en uso. Pero sí requiere JAR y DLL específicas de la plataforma.

Otros consejos

dado que está utilizando JDialog, que es una clase de oscilación por qué no usar JFileChooser ?

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

FileNameExtensionFilter es un buen Java 6 clase que hace exactamente lo que desea.

También estoy tratando de hacer eso. Quiero usar FileDialog en lugar de JFileChooser.

He encontrado la respuesta aquí: http://www.rgagnon.com/javadetails/ java-0247.html

Se dice que "en la plataforma de victorias, el método setFilenameFilter no funcionan. Debemos usar el método SetFile lugar para establecer un filtro."

No hay código fuente en el enlace especificado.

He probado y funciona:

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

Puede llamar a la de Windows FileDialog nativa (CFileDialog) con JNI. Los filtros se pueden establecer para CFileDialog fácilmente.

Me escribió una clase de contenedor simple para CFileDialog hace varios meses, si usted está interesado, puede obtener la fuente y binario a partir

proyecto Xfiledialog en Google Code

Si alguna vez utiliza JavaFX 2 , clase FileChooser va a hacer exactamente lo que necesita sin que ninguno de los problemas JFileChooser / FileDialog. También puede incrustar JavaFX 2 componentes dentro de las aplicaciones Swing, pero es necesario tiempo de ejecución de JavaFX .

Ejemplo:

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

Sólo tiene que utilizar método setFilenameFilter de la instancia 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");
                                }
                            });
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top