2010-08-14 7 views
4

스윙에서 한 가지 일을하고 싶습니다. 충분히 명확 해지기를 바랍니다.생성 된 파일 목록에서 파일 아이콘을 표시합니다.

확장명을 기반으로 사용자가 특정 파일과 연관된 아이콘 목록이 표시되도록하고 싶습니다. 그러나, 나는이 파일 목록을 프로그램에서 생성하기를 원합니다 : 즉, 표시된 파일 아이콘은 이 아니며은 실제 파일이 될 수 있습니다 (따라서 JFileChooser을 사용할 수 없습니다).

이 문제를 해결할 수있는 방법이 있습니까?

+1

흠, 주어진 운영 체제에서 파일과 관련된 아이콘을 어떻게 찾을 수 있는지 궁금합니다. 좋은 질문. – jjnguy

답변

1

확인. 이것은 잘 작동합니다. 나는 thisthis에서 아이디어를 얻었습니다.

아이디어는 고전적인 JList을 만듭니다. 그러나 ListCellRenderer 사용자 지정을 추가하여 임시 파일 트로프 JFileChooser에서 가져온 아이콘을 그립니다. 이 (내가 필드 정적 만든, 그래서 그들은 JList가 될 때마다 다시 생성되지 않음)과 같은 결과 렌더러 같습니다 파일을 나타내는 것, 내가, 다음, JListString와의를 채울 수

package app; 

import java.awt.Component; 
import java.io.File; 
import java.io.IOException; 
import java.util.HashMap; 
import java.util.regex.Matcher; 
import java.util.regex.Pattern; 
import javax.swing.DefaultListCellRenderer; 
import javax.swing.Icon; 
import javax.swing.JFileChooser; 
import javax.swing.JLabel; 
import javax.swing.JList; 
public class PseudofileIconRenderer extends DefaultListCellRenderer { 

    private static HashMap<String, Icon> extIcons = new HashMap<String, Icon>(); 
    private static Pattern p = Pattern.compile("\\.\\w+$"); 
    private static JFileChooser chooser = new JFileChooser(); 

    @Override 
    public Component getListCellRendererComponent(
     JList list, Object value, int index, 
     boolean isSelected, boolean cellHasFocus) { 


    JLabel label = 
      (JLabel) super.getListCellRendererComponent(list, 
      value, index, isSelected, cellHasFocus); 


    String filename = (String) value; 
    Matcher m = p.matcher(filename); 
    Icon i; 
    String extension = m.find() ? m.group() : ""; 
    if (extIcons.containsKey(extension)) { 
     i = extIcons.get(extension); 
    } else { 
     File file; 
     try { 
      file = File.createTempFile("icon", extension); 
      file.deleteOnExit(); 

      i = chooser.getIcon(file); 
      extIcons.put(extension, i); 

     } catch (IOException ex) { 
      //this shouldn't happen anyway 
      i = null; 
     } 
    } 

    label.setIcon(i); 

    return label; 
} 

을 . ! 여기

import java.io.*; 
import javax.swing.*; 
import java.awt.*; 
import javax.swing.filechooser.FileSystemView; 

public class IconExtract2 { 
public static void main(String[] args) throws Exception { 
String s = "c:/windows/regedit.exe"; 
File file = new File(s); 

// Get metadata and create an icon 
Icon icon = FileSystemView.getFileSystemView().getSystemIcon(file); 

// show the icon 
JLabel ficon = new JLabel(s, icon, SwingConstants.LEFT); 

JFrame frame = new JFrame(); 
frame.getContentPane().add(ficon); 
frame.pack(); 
frame.setVisible(true); 
} 
} 

링크입니다 : 인터넷 검색을하는 동안

1

내가 지금 생각한 한 가지 못생긴 해킹이 효과가 있을지 모르겠다.

임시 폴더를 만든 다음 동일한 파일 이름의 빈 파일을 넣은 다음 해당 폴더에 JFileChooser을 제시 한 다음 창을 닫은 후 해당 폴더를 삭제할 수 있습니다.

"깨끗한"솔루션을 선호합니다.

4

안녕 나는 ... 홉 [대체 텍스트가] [1] 전자는이 도움이 :)

import java.io.*; 
import javax.swing.*; 

public class IconExtract1 { 
public static void main(String[] args) throws Exception { 
String s = "c:/windows/regedit.exe"; 
File file = new File(s); 

// Get metadata and create an icon 
sun.awt.shell.ShellFolder sf = 
     sun.awt.shell.ShellFolder.getShellFolder(file); 
Icon icon = new ImageIcon(sf.getIcon(true)); 
System.out.println("type = " + sf.getFolderType()); 

// show the icon 
JLabel ficon = new JLabel(s, icon, SwingConstants.LEFT); 
JFrame frame = new JFrame(); 
frame.getContentPane().add(ficon); 
frame.pack(); 
frame.setVisible(true); 
} 
} 

다른 방법이 건너 온 : http://www.rgagnon.com/javadetails/java-0439.html

+0

아, 죄송합니다, 나는 그것을 잘못 읽었습니다. 어떤 이유로 OS X에서 작동하지 않습니다. 각 파일에 대해 동일한 아이콘을 반환합니다. 내 대답은 해결책이 거기에서 작동합니다. –

관련 문제