Отображать значки файлов из сгенерированного списка файлов в разгаре - PullRequest
4 голосов
/ 14 августа 2010

Я хочу сделать одну вещь в Swing, надеюсь, я буду достаточно ясен.

Я хочу отобразить список файлов со значками, которые пользователь связал с этим конкретным файлом, на основе расширения.Однако я хочу, чтобы этот список файлов создавался в программе - я имею в виду: отображаемые значки файлов не будут фактическими файлами в папке (поэтому я не могу использовать JFileChooser).

Есть ли что-нибудь, что может мне помочь с этим?

Ответы [ 3 ]

4 голосов
/ 16 августа 2010

Привет, я наткнулся на это, пока гуглял ... хоп! [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

1 голос
/ 15 августа 2010

OK.Это хорошо работает.Я взял идеи из этой и этой статьи.

Идея в том, что я создаю классический JList, но я добавляю пользовательский ListCellRenderer для рисованиязначки, которые взяты из временных файлов через JFileChooser.Получившееся средство рендеринга выглядит следующим образом (я сделал поля статическими, чтобы они не создавались заново при каждом выполнении JList):

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

Затем я могу заполнить JList String s, это будет представлять файлы.

1 голос
/ 14 августа 2010

Один ужасный хак, о котором я только что подумал, я не знаю, сработает ли он.

Я могу создать временную папку, затем поместить туда пустые файлы с такими же именами файлов и затем указать JFileChooser в этой папке, а затем, после закрытия окна, удалить эту папку.

Я бы предпочел более «чистое» решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...