스윙에서 한 가지 일을하고 싶습니다. 충분히 명확 해지기를 바랍니다.생성 된 파일 목록에서 파일 아이콘을 표시합니다.
확장명을 기반으로 사용자가 특정 파일과 연관된 아이콘 목록이 표시되도록하고 싶습니다. 그러나, 나는이 파일 목록을 프로그램에서 생성하기를 원합니다 : 즉, 표시된 파일 아이콘은 이 아니며은 실제 파일이 될 수 있습니다 (따라서 JFileChooser
을 사용할 수 없습니다).
이 문제를 해결할 수있는 방법이 있습니까?
스윙에서 한 가지 일을하고 싶습니다. 충분히 명확 해지기를 바랍니다.생성 된 파일 목록에서 파일 아이콘을 표시합니다.
확장명을 기반으로 사용자가 특정 파일과 연관된 아이콘 목록이 표시되도록하고 싶습니다. 그러나, 나는이 파일 목록을 프로그램에서 생성하기를 원합니다 : 즉, 표시된 파일 아이콘은 이 아니며은 실제 파일이 될 수 있습니다 (따라서 JFileChooser
을 사용할 수 없습니다).
이 문제를 해결할 수있는 방법이 있습니까?
확인. 이것은 잘 작동합니다. 나는 this과 this에서 아이디어를 얻었습니다.
아이디어는 고전적인 JList
을 만듭니다. 그러나 ListCellRenderer
사용자 지정을 추가하여 임시 파일 트로프 JFileChooser
에서 가져온 아이콘을 그립니다. 이 (내가 필드 정적 만든, 그래서 그들은 JList
가 될 때마다 다시 생성되지 않음)과 같은 결과 렌더러 같습니다 파일을 나타내는 것, 내가, 다음, JList
String
와의를 채울 수
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);
}
}
링크입니다 : 인터넷 검색을하는 동안
내가 지금 생각한 한 가지 못생긴 해킹이 효과가 있을지 모르겠다.
임시 폴더를 만든 다음 동일한 파일 이름의 빈 파일을 넣은 다음 해당 폴더에 JFileChooser
을 제시 한 다음 창을 닫은 후 해당 폴더를 삭제할 수 있습니다.
"깨끗한"솔루션을 선호합니다.
안녕 나는 ... 홉 [대체 텍스트가] [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
아, 죄송합니다, 나는 그것을 잘못 읽었습니다. 어떤 이유로 OS X에서 작동하지 않습니다. 각 파일에 대해 동일한 아이콘을 반환합니다. 내 대답은 해결책이 거기에서 작동합니다. –
흠, 주어진 운영 체제에서 파일과 관련된 아이콘을 어떻게 찾을 수 있는지 궁금합니다. 좋은 질문. – jjnguy