2011-12-15 20 views
28

Podaję niektóre nazwy plików z ich ikonami (jak te w Eksploratorze Windows) w JTable. Znam dwa sposoby, aby uzyskać ikonę jeśli mam File obiekt z lokalnego systemu plików:Jak uzyskać ikonę rozszerzenia pliku lub typu pliku bez tworzenia pliku tymczasowego?

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

dla ikony 16x16 lub większy:

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

Ponieważ moje pliki są przechowywane w bazie danych nie mam obiektu File. Moim rozwiązaniem jest utworzenie pliku tymczasowego o określonym rozszerzeniu nazwy pliku, użycie jednej z powyższych metod i zapisanie w pamięci podręcznej ikony, aby wyświetlić ją w narzędziu CellRenderer.

Szukałem rozwiązania bez plików tymczasowych i znalazł dwa nie lubię albo:

  • org.eclipse.swt.program.Program.findProgram(String extension).getImageData(), ale nie chcę używać SWT
  • org.jdesktop.jdic.icons.IconService z inkubatora projektu JDIC . Ostatnie zmiany na IconService są 6 lat temu, na JDIC 2 lata temu i nie mogę znaleźć słoja do pobrania.

Czy istnieje inne rozwiązanie?

+1

Zmieniono tag Swing na tag SWT – mKorbel

+7

Dlaczego? Plakat wyraźnie stwierdził, że nie chcą używać SWT. –

+0

Od przeglądania źródła FileSystemView używa wewnętrznie pliku Shellfolder. Program ShellFolder nie implementuje getIcon. Ale Win32ShellFolder2 robi (link źródłowy dostępny) http://javasourcecode.org/html/open-source/jdk/jdk-6u23/sun/awt/shell/Win32ShellFolder2.html – Stefan

Odpowiedz

4

Looks jak już odkrył sposób, aby to zrobić, jeśli nie chcesz, aby zanurzyć się w bibliotekach rodzimych itp

FileSystemView wykorzystuje Win32ShellFolder wewnętrznie więc są w zasadzie takie same.

Również wykopałem źródło dla org.eclipse.swt.program.Program, a wraz z nim org.eclipse.swt.internal.win32.OS. Klasa OS używa wtedy natywnego wywołania ikony. W tym momencie, chyba że naprawdę nie możesz utworzyć pliku Temp, nie pójdę tą ścieżką.

Dla JDIC znalazłem tylko http://kickjava.com/src/org/jdesktop/jdic/tray/internal/impl/WinTrayIconService.java.htm z odrobiną kopania (może nie być związane, ale robi rzeczy icony: D). Również nazywa się natywny.

0

Czy naprawdę potrzebujesz pliku tymczasowego do korzystania z pierwszej opcji? Plik nie musi oznaczać pliku, który faktycznie istnieje ...

+1

Dzięki za twoją sugestię, ale dwie pierwsze opcje działają tylko po 'file = new File (" easyasabc.pdf ")' Obiekt file został utworzony _on disk_ z 'file.createNewFile()'. – bobndrew

Powiązane problemy