2011-12-15 29 views
28

Tôi liệt kê một số tên tệp có biểu tượng của chúng (giống như tên trong Windows Explorer) trong một số JTable. Tôi biết hai cách để có được những biểu tượng nếu tôi có một đối tượng File từ hệ thống tệp cục bộ:Làm cách nào để nhận biểu tượng cho phần mở rộng tệp hoặc loại tệp mà không tạo tệp tạm thời?

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

cho một biểu tượng 16x16 hoặc cho một lớn hơn một:

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

Kể từ khi tác phẩm của tôi được lưu trữ trong cơ sở dữ liệu, tôi không có đối tượng File. Cách giải quyết của tôi là tạo một tệp tạm thời với phần mở rộng tên tệp cụ thể, sử dụng một trong hai phương pháp ở trên và lưu vào bộ nhớ cache biểu tượng để hiển thị nó trong một CellRenderer.

Tôi tìm kiếm một giải pháp mà không tập tin tạm thời và tìm thấy hai tôi không thích một trong hai:

  • org.eclipse.swt.program.Program.findProgram(String extension).getImageData(), nhưng tôi không muốn sử dụng SWT
  • org.jdesktop.jdic.icons.IconService từ vườn ươm của dự án JDIC . Những thay đổi cuối cùng trên IconService là 6 năm trước, trên JDIC 2 năm trước và tôi không thể tìm thấy một chai có thể tải xuống được.

Có giải pháp nào khác không?

+1

Tôi đã thay đổi thẻ Swing thành thẻ SWT – mKorbel

+7

Tại sao? Người áp phích nói rõ ràng rằng họ không muốn sử dụng SWT. –

+0

Từ khi phát hành nguồn, FileSystemView sử dụng ShellFolder trong nội bộ. ShellFolder tự nó không thực hiện getIcon. Nhưng Win32ShellFolder2 có (liên kết nguồn có sẵn) http://javasourcecode.org/html/open-source/jdk/jdk-6u23/sun/awt/shell/Win32ShellFolder2.html – Stefan

Trả lời

4

Looks như bạn đã phát hiện ra cách để làm điều đó, trừ khi bạn muốn đi sâu vào các thư viện nguồn gốc, vv

FileSystemView sử dụng Win32ShellFolder nội bộ để họ về cơ bản giống nhau.

Tôi cũng đào nguồn cho org.eclipse.swt.program.Program và với số org.eclipse.swt.internal.win32.OS. Các lớp hệ điều hành sau đó sử dụng một cuộc gọi bản địa cho biểu tượng. Tại thời điểm này, trừ khi bạn thực sự thực sự không thể tạo ra một Temp File tôi sẽ không đi xuống con đường đó.

Đối với JDIC tôi chỉ tìm thấy http://kickjava.com/src/org/jdesktop/jdic/tray/internal/impl/WinTrayIconService.java.htm với một chút đào (có thể không liên quan nhưng những điều icony: D). Cũng gọi bản địa.

0

Bạn có thực sự cần tệp tạm thời để sử dụng tùy chọn đầu tiên không? Tệp không phải biểu thị tệp thực sự tồn tại ...

+1

Cảm ơn đề xuất của bạn, nhưng hai tùy chọn đầu tiên chỉ hoạt động sau khi tệp 'file = new File (" easyasabc.pdf ")' được tạo ra _on disk_ với 'file.createNewFile()'. – bobndrew

Các vấn đề liên quan