2011-12-15 21 views
28

Enumero algunos nombres de archivo con sus iconos (como los que están en el Explorador de Windows) en un JTable. Sé que las dos formas de obtener el icono si tengo un objeto File desde el sistema de archivos local:¿Cómo obtener el ícono para una extensión de archivo o tipo de archivo sin crear un archivo temporal?

javax.swing.filechooser.FileSystemView.getFileSystemView().getSystemIcon(file) 

un icono de 16x16 o para una más grande:

sun.awt.shell.ShellFolder.getShellFolder(file).getIcon(true)) 

Desde mis archivos se almacenan en una base de datos, no tengo el objeto File. Mi solución consiste en crear un archivo temporal con la extensión de nombre de archivo específica, usar uno de los dos métodos anteriores y almacenar en caché el icono para mostrarlo en un CellRenderer.

buscaba una solución sin los ficheros temporales y encontraron dos que no me gusta, ya sea:

  • org.eclipse.swt.program.Program.findProgram(String extension).getImageData(), pero no quiero utilizar SWT
  • org.jdesktop.jdic.icons.IconService de la incubadora del proyecto JDIC . Los últimos cambios en el IconService son hace 6 años, en JDIC hace 2 años y no puedo encontrar un archivo descargable.

¿Hay alguna otra solución?

+1

he cambiado la etiqueta oscilación a la etiqueta SWT – mKorbel

+7

¿Por qué? El cartel decía explícitamente que no querían usar SWT. –

+0

Desde la búsqueda de la fuente FileSystemView usa ShellFolder internamente. ShellFolder no implementa getIcon. Pero hace Win32ShellFolder2 (enlace de la fuente disponible) http://javasourcecode.org/html/open-source/jdk/jdk-6u23/sun/awt/shell/Win32ShellFolder2.html – Stefan

Respuesta

4

Looks como si ya descubrir la forma de hacerlo, a menos que desee sumergirse en bibliotecas nativas etc.

FileSystemView utiliza Win32ShellFolder internamente por lo que son básicamente los mismos.

También desenterré la Fuente para org.eclipse.swt.program.Program y con ella org.eclipse.swt.internal.win32.OS. La clase de sistema operativo luego utiliza una llamada nativa para el icono. En este punto, a menos que realmente no puedas crear un archivo temporal, yo no iría por ese camino.

Para JDIC solo encontré http://kickjava.com/src/org/jdesktop/jdic/tray/internal/impl/WinTrayIconService.java.htm con un poco de excavación (puede que no esté relacionado pero sí cosas icónicas: D). También se llama nativo.

0

lo que realmente necesita el archivo temporal para utilizar la primera opción? Un archivo no tiene que designar un archivo que realmente existe ...

+1

Gracias por su sugerencia, pero las dos primeras opciones solo funcionan después de que 'file = new File (" easyasabc.pdf ")' El objeto de archivo se creó _en disk_ con 'file.createNewFile()'. – bobndrew

Cuestiones relacionadas