Java JFrame图标图像不工作

Java JFrame图标图像不工作,java,swing,jframe,jpanel,imageicon,Java,Swing,Jframe,Jpanel,Imageicon,我一直在互联网上搜索,试图找到如何将图标图像添加到我的JFrame中,但我不断收到错误。我知道这是关于堆栈溢出的问题,但解决方案不适合我。这是我的密码: ImageIcon imageIcon = new ImageIcon("src/slime.png"); ImageIcon image = new ImageIcon("src/slime.gif"); JLabel label = new JLabel(image, JLabel.CENTER); lab

我一直在互联网上搜索,试图找到如何将图标图像添加到我的JFrame中,但我不断收到错误。我知道这是关于堆栈溢出的问题,但解决方案不适合我。这是我的密码:

    ImageIcon imageIcon = new ImageIcon("src/slime.png");
    ImageIcon image = new ImageIcon("src/slime.gif");

    JLabel label = new JLabel(image, JLabel.CENTER);
    label.setAlignmentX(0);
    label.setAlignmentY(0);
    label.setIcon(image);

    JFrame window = new JFrame("Slime");
    window.setVisible(true);
    window.setSize(250, 200);
    window.setResizable(false);
    window.setIconImage(newImageIcon(getClass().getResource("src/slime.png")).getImage());
    window.add(label);
以下是我得到的错误: 线程“AWT-EventQueue-0”java.lang.NullPointerException中的异常 位于javax.swing.ImageIcon.(ImageIcon.java:205) 在MainJFrame。(MainJFrame.java:39) MainJFrame$1.run(MainJFrame.java:18) 在java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251)中 位于java.awt.EventQueue.dispatchEventImpl(EventQueue.java:727) 在java.awt.EventQueue.access$200(EventQueue.java:103) 在java.awt.EventQueue$3.run(EventQueue.java:688) 在java.awt.EventQueue$3.run(EventQueue.java:686) 位于java.security.AccessController.doPrivileged(本机方法) 位于java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) 位于java.awt.EventQueue.dispatchEvent(EventQueue.java:697) 位于java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242) 在java.awt.EventDispatchThread.PumpeEventsforFilter(EventDispatchThread.java:161) 位于java.awt.EventDispatchThread.PumpeEventsforHierarchy(EventDispatchThread.java:150) 位于java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146) 位于java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138) 在java.awt.EventDispatchThread.run(EventDispatchThread.java:91)


非常感谢您的帮助。注意:我试过window.setIconImage(imageIcon.getImage());但这不起作用,使我在屏幕上打印的另一个图像消失。

使用
getClass
获取图像:

window.setIconImage(new ImageIcon(
                getClass().getResource("src/slime.png")).getImage());
但是,如果要将图像添加到标签中,请将标签添加到框架中,请改用以下方法:

Image img = (new ImageIcon(getClass().getResource("src/slime.png"))).getImage();
JLabel lblIcon = new JLabel(new ImageIcon(newimg));
window.add(lblIcon);
如果要将图像大小调整为窗口大小,请执行以下操作(在将其添加到窗口之前输入代码):

编辑:

当然,您不能在
publicstaticvoidmain()
方法中使用
getClass()
,您应该将代码放在
非静态的地方,例如类构造函数

public class MainForm extends javax.swing.JFrame {

/**
 * Creates new form MainForm
 */
public MainForm() {
    //put your code here...
    window.setIconImage(new ImageIcon(
            getClass().getResource("src/slime.png")).getImage());
}
public static void main(String args[]) {
    /* Create and display the form */
    java.awt.EventQueue.invokeLater(new Runnable() {
        @Override
        public void run() {
                new MainForm().setVisible(true);
            }
        });
    }

尝试捕捉
块来检查图像是否正确,这总是很好的。尽管在这种情况下,从软件包内部获取代码并不是必需的,但如果您要从项目外部获取任何资源,请确保打开过程。

试试这个。与sajjad的答案非常相似,只是在使用图像url之前,需要检查图像url是否为空

java.net.URL imageUrl = YourClass.class.getResource("/IconImage.png");
if(imageUrl != null){
   setIconImage(new ImageIcon(imageUrl));
}

试试这个,一定有用

frame.setIconImage(Toolkit.getDefaultToolkit().getImage(getClass().getResource("/src/slime.gif")));
你写道

newImageIcon()
这可能是一个方法,因为它是为您编译的。我认为您可能必须将其写成
newimageicon()
这可能就是问题所在。未创建
javax.swing.ImageIcon

简单地说,你为什么不使用

setIconImage(imageIcon.getImage());
这是完整的代码

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
class IconImageDemo1 extends JFrame
{

    public IconImageDemo1()
    {
        createAndShowGUI();
    }

    private void createAndShowGUI()
    {
        setTitle("IconImage Demo");
        setLayout(new FlowLayout());
        setSize(400,400);
        setVisible(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


        setIconImage(Toolkit.getDefaultToolkit().getImage(getClass().getResource("icons/camera.png")));

        setLocationRelativeTo(null);
    }

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

首先,出于安全考虑,不要尝试在main方法中使用JFrame。这就是为什么您会从一些解决方案中得到一些静态错误。在我看来,静态只是一个大问题,因为一旦你做了一个静态,你就让它们都是静态的。尝试在构造函数中初始化JFrame,而不是在main方法中初始化。只需在main方法中创建一个新的MainJFrame对象:

public static void main(String[] args){
    MainJFrame frame = new MainJFrame();
}
将所有代码放入构造函数中,如果您不知道这是什么,您应该知道这是一个什么样的构造函数:

public MainJFrame(){
    //This is a constructor
    //All frame init code in here
}
然后将相同的代码放在那里,但在
setIconImage()
参数中的
new
ImageIcon
之间留一个空格。因此,整个构造函数应该如下所示:

public MainJFrame(){
    ImageIcon imageIcon = new ImageIcon("src/slime.png");
    ImageIcon image = new ImageIcon("src/slime.gif");

    JLabel label = new JLabel(image, JLabel.CENTER);
    label.setAlignmentX(0);
    label.setAlignmentY(0);
    label.setIcon(image);

    JFrame window = new JFrame("Slime");
    window.setVisible(true);
    window.setSize(250, 200);
    window.setResizable(false);
    window.setIconImage(new ImageIcon(getClass().getResource("src/slime.png")).getImage());
    window.add(label); }
如果仍然不起作用,请尝试使用ImageIO加载图像。但这在小程序上不起作用,因为它会给你一个安全错误

window.setIconImage(ImageIO.read(new File("folder/to/file.png")));

您还需要将这一行环绕在throw/catch块中,如果您在eclipse中工作,那么请确保该文件位于主包之外的文件夹中。除此之外,你应该很好。

发生了什么错误?你能把你的错误粘贴到这里吗?当我尝试window.setIconImage(ImageIO.read(“src/slime.png”);我得到一个错误,类型ImageIO中的方法read(File)不适用于参数(字符串)。如果您还没有,请阅读底部的注释。:)嗯,setIconImage(ImageIO.read(“…”);您所指的不在您的帖子中;事实上,调用setIconImage时根本没有任何参数。在网络上有很多(,很多)例子说明如何做到这一点,我不知道提供更多的随机例子是否会有所帮助。如果您想知道自己做错了什么,请将代码减少到显示问题所需的最小值,并告诉我们在运行时会发生什么,以及您在代码中尝试了什么,而不仅仅是一个随机语句,我们必须猜测它。错误:无法对非静态方法getClass()进行静态引用从类型Object@user1952565从
static main
中删除您的代码,并将它们放入另一个类中,并从中生成一个实例。@user1952565您收到了吗?这是我的代码和我尝试运行时的错误@sajjadG@user1952565把你的产出放在你的问题里。这有助于trobleshooting。无法从类型ObjectAll components默认为flow layout对非静态方法getClass()进行静态引用。
window.setIconImage(ImageIO.read(new File("folder/to/file.png")));