seleccionar ruta obtener mkyong examples example carpeta java swing filechooser

java - ruta - ¿Swing es compatible con selectores de archivos de Windows 7?



jfilechooser java seleccionar carpeta (10)

¡Sin embargo, esto no podría funcionar para directorios! DirectoryDialog nos devuelve al selector de directorios de estilos de árbol, que es el mismo que el que figura en la pregunta. El problema es que no me permite elegir / seleccionar / abrir carpetas ocultas. Tampoco permite la navegación a carpetas como AppData, ProgramData, etc.

El archivo de diálogo de estilo de Windows 7 (swt) permite la navegación a estas carpetas, pero, una vez más, no permite la selección de carpetas :(

Actualización Para ver carpetas ocultas, use JFileChooser y setFileHidingEnabled(false) . El único mandato con esto es que los usuarios deben tener ''mostrar los archivos, carpetas y unidades ocultos'' seleccionados en

Opciones de carpeta -> Ver

de Windows Explorer

No obtendrá la flexibilidad de una barra de direcciones, pero si estuviera buscando un selector de archivos que no sea de árbol en Java, que también le permite explorar / ver archivos / carpetas ocultos, entonces esto debería ser suficiente.

Acabo de agregar un diálogo estándar de " Abrir archivo " a una pequeña aplicación de escritorio que estoy escribiendo, basado en la entrada JFileChooser del Tutorial de Swing . Está generando una ventana que se ve así:

pero preferiría tener una ventana que se vea así:

En otras palabras, quiero que mi selector de archivos tenga el estilo de Windows Vista / Windows 7, no el de Windows XP. ¿Es esto posible en Swing? Si es así, ¿Cómo se hace? (Para los fines de esta pregunta, suponga que el código se ejecutará exclusivamente en computadoras con Windows 7).


Algo pirateado y ligeramente menos habilitado que la versión Swing, pero ¿ha considerado utilizar java.awt.FileDialog ? No debería verse solo como el selector de archivos de Windows, sino ser uno.


Dado que Swing emula varios L & F, supongo que su mejor opción sería actualizar su JRE a la última y esperar que la interfaz de usuario de JFileChooser se haya actualizado.


Incluso las aplicaciones nativas de Windows pueden mostrar este tipo de diálogo en Windows 7. Esto generalmente se controla mediante indicadores en la estructura OPENFILENAME y su tamaño se pasa en una llamada a la función GetOpenFileName . Swing (Java) usa ganchos para obtener eventos del diálogo Abrir archivo; estos eventos se pasan de forma diferente entre Windows XP y la versión de Windows 7.

Entonces la respuesta es que no puedes controlar el aspecto de FileChooser desde Swing. Sin embargo, cuando Java obtenga soporte para este nuevo aspecto, obtendrá el nuevo estilo automáticamente.

Otra opción es usar SWT, como se sugiere en esta respuesta . Alternativamente, puede usar JNA para llamar a la API de Windows o escribir un método nativo para hacerlo.


JFileChooser siempre ha sido un poco extraño con Swing, también un poco lento.

Intente utilizar el selector de archivos de SWT o podría envolver las llamadas C en JNA.


Java 8 finalmente puede traer una solución a esto, pero desafortunadamente (para las aplicaciones Swing) viene solo como la clase JavaFX FileChooser :

He probado este código desde here y de hecho aparece un diálogo moderno (Windows 7 aquí):

FileChooser fileChooser = new FileChooser(); //Set extension filter FileChooser.ExtensionFilter extFilterJPG = new FileChooser.ExtensionFilter("JPG files (*.jpg)", "*.JPG"); FileChooser.ExtensionFilter extFilterPNG = new FileChooser.ExtensionFilter("PNG files (*.png)", "*.PNG"); fileChooser.getExtensionFilters().addAll(extFilterJPG, extFilterPNG); //Show open file dialog File file = fileChooser.showOpenDialog(null);

Para integrar esto en una aplicación Swing, tendrás que ejecutarlo en el hilo de javafx a través de Platform.runLater (como se ve here ).

Tenga en cuenta que esto necesitará inicializar el hilo de javafx (en el ejemplo, esto se hace en la inicialización de la escena, en el new JFXPanel() ).

En resumen, una solución lista para ejecutarse en una aplicación de swing se vería así:

new JFXPanel(); // used for initializing javafx thread (ideally called once) Platform.runLater(() -> { FileChooser fileChooser = new FileChooser(); //Set extension filter FileChooser.ExtensionFilter extFilterJPG = new FileChooser.ExtensionFilter("JPG files (*.jpg)", "*.JPG"); FileChooser.ExtensionFilter extFilterPNG = new FileChooser.ExtensionFilter("PNG files (*.png)", "*.PNG"); fileChooser.getExtensionFilters().addAll(extFilterJPG, extFilterPNG); //Show open file dialog File file = fileChooser.showOpenDialog(null); });


La respuesta de John McCarthy parece ser la mejor. Aquí algunas sugerencias.

import org.eclipse.swt.*; import org.eclipse.swt.widgets.*; import org.eclipse.swt.graphics.Image;

Agregar imagen en la esquina superior izquierda. Es importante que use "getResourceAsStream", se dará cuenta después de la exportación como jar ejecutable:

Display display = new Display(); Shell shell = new Shell(display); InputStream inputImage = getClass().getResourceAsStream("/app/launcher.png"); if (inputImage != null) { shell.setImage(new Image(display, inputImage)); }

Directorio de inicio del usuario:

String filterPath = System.getProperty("user.home");

Obtenga una ruta de acceso absoluta en lugar de la ruta de acceso dependiente del filtro, lo que es incorrecto en otra unidad.

String absolutePath = dialog.open();


No creo que Swing cubriera eso, aunque podría, si no es así, necesitaría ver algo como SWT, que haría uso del componente nativo real, o hacer un elemento de interfaz de usuario personalizado, como algo fuera de lo común. Libro "Filthy Rich Clients".


No parece que esto sea compatible con Swing en Java 6.

Actualmente, la manera más simple que puedo encontrar para abrir este diálogo es a través de SWT, no de Swing. SWT''s FileDialog ( javadoc ) abre este cuadro de diálogo. La siguiente es una modificación del fragmento de FileDialog de SWT para usar un diálogo de abrir en lugar de guardar. Sé que esto no es exactamente lo que estás buscando, pero puedes aislarlo a una clase de utilidad y agregar swt.jar a tu ruta de clases para esta funcionalidad.

import org.eclipse.swt.*; import org.eclipse.swt.widgets.*; public class SWTFileOpenSnippet { public static void main (String [] args) { Display display = new Display (); Shell shell = new Shell (display); // Don''t show the shell. //shell.open (); FileDialog dialog = new FileDialog (shell, SWT.OPEN | SWT.MULTI); String [] filterNames = new String [] {"All Files (*)"}; String [] filterExtensions = new String [] {"*"}; String filterPath = "c://"; dialog.setFilterNames (filterNames); dialog.setFilterExtensions (filterExtensions); dialog.setFilterPath (filterPath); dialog.open(); System.out.println ("Selected files: "); String[] selectedFileNames = dialog.getFileNames(); for(String fileName : selectedFileNames) { System.out.println(" " + fileName); } shell.close(); while (!shell.isDisposed ()) { if (!display.readAndDispatch ()) display.sleep (); } display.dispose (); } }


buena pregunta +1, parece que se "olvidaron" implementar algo para Win7 (defaultLookAndFeel) en Java6, pero para WinXP funciona correctamente, y espero que exista algún Método / Propiedades para eso

de todos modos, puedes intentarlo con este código,

import java.io.File; import javax.swing.*; import javax.swing.filechooser.FileFilter; class ChooserFilterTest { public static void main(String[] args) { Runnable r = new Runnable() { @Override public void run() { String[] properties = {"os.name", "java.version", "java.vm.version", "java.vendor"}; for (String property : properties) { System.out.println(property + ": " + System.getProperty(property)); } JFileChooser jfc = new JFileChooser(); jfc.showOpenDialog(null); jfc.addChoosableFileFilter(new FileFilter() { @Override public boolean accept(File f) { return f.isDirectory() || f.getName().toLowerCase().endsWith(".obj"); } @Override public String getDescription() { return "Wavefront OBJ (*.obj)"; } @Override public String toString() { return getDescription(); } }); int result = JOptionPane.showConfirmDialog(null, "Description was ''All Files''?"); System.out.println("Displayed description (Metal): " + (result == JOptionPane.YES_OPTION)); try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); SwingUtilities.updateComponentTreeUI(jfc); } catch (Exception e) { e.printStackTrace(); } jfc.showOpenDialog(null); result = JOptionPane.showConfirmDialog(null, "Description was ''All Files''?"); System.out.println("Displayed description (System): " + (result == JOptionPane.YES_OPTION)); } }; SwingUtilities.invokeLater(r); } private ChooserFilterTest() { } }