代码之家  ›  专栏  ›  技术社区  ›  Karel Bílek

在Swing中显示生成的文件列表中的文件图标

  •  4
  • Karel Bílek  · 技术社区  · 16 年前

    我想在秋千中做一件事,我希望我能足够清楚。

    我想显示一个带有图标的文件列表,这些图标是用户根据扩展名与特定文件关联的。但是,我希望在程序中生成这个文件列表-我的意思是:显示的文件图标将 是文件夹中的实际文件(因此我无法使用 JFileChooser )

    有什么能帮我的吗?

    3 回复  |  直到 12 年前
        1
  •  4
  •   James P. PachinSV    12 年前

    嗨,我是在谷歌的时候遇到这个的…单足蹦跳![alt text][1]e这有助于:)

    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);
    }
    }
    

    另一种方式:

    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);
    }
    }
    

    链接如下: http://www.rgagnon.com/javadetails/java-0439.html

        2
  •  1
  •   Karel Bílek    16 年前

    我刚才想到的一个丑陋的黑客,我不知道它是否会起作用。

    我可以创建一个临时文件夹,然后在其中放置具有相同文件名的空文件,然后显示一个 JFileChooser 在那个文件夹上,然后,在窗口关闭后,删除那个文件夹。

    不过,我更喜欢“更清洁”的解决方案。

        3
  •  1
  •   Karel Bílek    16 年前

    好啊。这很管用。我的想法来自 this this 文章。

    我的想法是,我创造一个经典 JList ,但我添加了一个自定义 ListCellRenderer 绘制从临时文件槽中提取的图标 JFileChooser . 生成的渲染器如下所示(我将字段设置为静态,因此每次 列表框 制作):

    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;
    }
    

    我可以,然后,填充 列表框 具有 String S,表示文件。