java - getResource 和 getResourceAsStream 返回 null

标签 java resources

我的程序由两个文件组成:

package net.sf.junace.demo;

import java.awt.BorderLayout;
import java.awt.Color;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import javax.swing.*;
import javax.swing.plaf.metal.MetalIconFactory;
import javax.swing.table.DefaultTableModel;

public class Manager extends JFrame {
    private static final long serialVersionUID = 1L;
    private JTextField textField;
    private JPanel panel;
    private JScrollPane scrollPanel;
    private JTable table;

    public Manager(String string) {
        super(string);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        panel = new JPanel();
        panel.setLayout(new BorderLayout(2, 2));

        textField = new JTextField(10);
        panel.add(textField, BorderLayout.NORTH);
        String[] columnNames = { "Name", "Size", "Modified" };
        File[] filesAndDirs = new File(".").listFiles();
        Object[][] data = new Object[filesAndDirs.length][3];
        for (int i = 0; i < filesAndDirs.length; i++) {
            data[i][0] = filesAndDirs[i].getName();
            data[i][1] = filesAndDirs[i].length();
            Date date = new Date(filesAndDirs[i].lastModified());
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-mm-dd hh:mm:ss");
            data[i][2] = sdf.format(date);
        }
        table = new JTable(data, columnNames);

        table.getTableHeader().getColumnModel().getColumn(0)
                .setCellRenderer(new IconRenderer(filesAndDirs));
        scrollPanel = new JScrollPane(table);
        panel.add(scrollPanel, BorderLayout.CENTER);
        add(panel);
        pack();
        setLocationRelativeTo(null);
        setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }

    protected static void createAndShowGUI() {
        Manager frame = new Manager("Manager");
    }
}

第二个:

package net.sf.junace.demo;

import java.awt.Component;
import java.io.File;
import java.io.InputStream;
import java.net.URL;

import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.table.DefaultTableCellRenderer;

public class IconRenderer extends DefaultTableCellRenderer {
    File[] files;
    // URL url;
    ImageIcon folderIcon;

    public IconRenderer(File[] files) {
        super();
        this.files = files;
        // THIS not works
        // InputStream in =
        // getClass().getClassLoader().getResourceAsStream("/folder16.png");
        // URL url = getClass().getClassLoader().getResource("/folder16.png");
        // folderIcon = new ImageIcon(url);

        // THIS works fine
        folderIcon = new ImageIcon("d:\\code\\proj.git\\Ikony\\folder16.png");

    }

    private static final long serialVersionUID = 1L;

    public Component getTableCellRendererComponent(JTable table, Object obj,
            boolean isSelected, boolean hasFocus, int row, int column) {
        super.getTableCellRendererComponent(table, obj, isSelected, hasFocus,
                row, column);
        if (files[row].isDirectory())
            setIcon(folderIcon);
        setBorder(UIManager.getBorder("TableHeader.cellBorder"));
        return this;
    }
}

这显示列表文件和目录。目录必须有图标。此示例适用于目录:

folderIcon = new ImageIcon("d:\\code\\proj.git\\Ikony\\folder16.png");

但我想将文件 folder16.png 放在项目目录中,将来放在 .jar 中。 getResource 和 getResourceAsStream 不起作用:

InputStream in = getClass().getClassLoader().getResourceAsStream("/folder16.png");

返回null

URL url = getClass().getClassLoader().getResource("/folder16.png");

也返回null,无论我将folder16.png放在哪里:在根项目目录或src子目录中。

最佳答案

您应该将其与需要该文件的类的 Java 源文件放在一起。那么你应该使用Class.getResource(String name)Class.getResourceAsStream(String name) 。换句话说,您应该跳过 getClassLoader() 调用。

您不需要文件的完整路径名,它会通过上述方法自动添加到名称前面。最好使用 IconRenderer.class 而不是 getClass(),因为不需要在运行时确定类。如果您这样做,那么扩展您的类的类可能会失败。

关于java - getResource 和 getResourceAsStream 返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18725009/

相关文章:

java - 创建aar文件并进行检查

api - REST API 如何对需要维护特定顺序的资源进行建模

grails - 资源插件-如何在目录中包含所有内容?

python - 为子进程提供 CPU 时间和内存

java - 乔克 : Unable to implement Seek in Dynamic Query

java - IntelliJ 无法使用 Maven 解析符号第 3 方 jar

java - Realm Java 预打包数据库

java - 对齐 <p :selectOneMenu> with <p:outputLabel> horizontally inside a table column (<p:panelGrid>)

java - 从类路径目录获取资源列表

silverlight - 如何在WP7应用程序中嵌入和读取文本文件?