Как получить значок для расширения файла или типа файла без создания временного файла?
Я перечисляю имена файлов с их значками (например, те, что содержатся в проводнике Windows) в JTable
. Я знаю два способа получить значок, если у меня есть объект File
из локальной файловой системы:
javax.swing.filechooser.FileSystemView.getFileSystemView().getSystemIcon( file )
для значка 16x16 или для более крупного:
sun.awt.shell.ShellFolder.getShellFolder( file ).getIcon( true ) )
Поскольку мои файлы хранятся в базе данных, у меня нет объекта File
. Мое обходное решение - создать временный файл с определенным расширением имени файла, использовать один из двух вышеперечисленных методов и кешировать значок, чтобы отобразить его в CellRenderer.
Я искал решение без временных файлов и нашел два, которые мне не нравятся:
-
org.eclipse.swt.program.Program.findProgram(String extension).getImageData()
, но я не хочу использовать SWT
-
org.jdesktop.jdic.icons.IconService
из инкубатора проекта JDIC. Последние изменения на IconService
- 6 лет назад, на JDIC 2 года назад, и я не могу найти загружаемую банку.
Есть ли другое решение?
Ответы
Ответ 1
Выглядит, как вы уже открыли способ сделать это, если вы не хотите погружаться в родные библиотеки и т.д.
FileSystemView использует Win32ShellFolder внутренне, поэтому они в основном одинаковы.
Я также выкопал источник org.eclipse.swt.program.Program и с ним org.eclipse.swt.internal.win32.OS. Затем класс ОС использует собственный вызов для значка. На данный момент, если вы действительно не можете создать файл Temp, я бы не пошел по этому пути.
Для JDIC я нашел http://kickjava.com/src/org/jdesktop/jdic/tray/internal/impl/WinTrayIconService.java.htm с небольшим рытьем (может и не быть связанным, но имеет иконические вещи: D). Также вызывает native.
Ответ 2
Вам действительно нужен временный файл, чтобы использовать первый вариант? Файл не должен указывать существующий файл...