Java getResource和getResourceAsStream返回null

Java getResource和getResourceAsStream返回null,java,resources,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.*; impor

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

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");
    }
}
这将显示文件和目录列表。目录必须有图标。此示例适用于目录:

folderIcon = new ImageIcon("d:\\code\\proj.git\\Ikony\\folder16.png");
但我希望将folder16.png文件放在项目目录中,将来放在.jar中。getResource和getResourceAsStream不起作用:

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


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

您应该将其与需要该文件的类的Java源文件放在一起。那么你应该使用or。换句话说,您应该跳过getClassLoader调用


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

jLabel1.setIconnew javax.swing.ImageIcongetClass.getResource/com/javaquery/icon_128.png;尝试这样做我认为您应该检查folder16.png是否位于包含classesPlace folder16.png的文件夹中,该文件夹位于src文件夹的默认包根目录中。我已将其放置在src\root和getResource/folder16.png中,但仍然存在错误。我已经把我的小例子的全部来源,为什么不工作?为什么你说它可能更好?getClass独立于类名或位置。@SotiriosDelimanolis问得好,我会做得更好:我不同意你的观点。如果重构类名,也必须修改代码。您不必使用getClass。@SotiriosDelimanolis Eclipse似乎可以很好地处理这种重构。如果您创建一个子类,它会变得有点棘手——如果我没有弄错的话,getClass将指向新的类——可能在另一个包中。在这种情况下,类至少应该是受保护的或最终的。类定义是特定于包的,资源也是特定于包的。不需要对类进行运行时确定,我尝试folderIcon=new-ImageIcongetClass.getResource/net/sf/junace/demo/folder16.png;而且不起作用-NullPointerException
InputStream in = getClass().getClassLoader().getResourceAsStream("/folder16.png");
URL url = getClass().getClassLoader().getResource("/folder16.png");