【问题标题】:JFrame Icon Image Not WorkingJFrame 图标图像不工作
【发布时间】:2013-07-15 21:12:55
【问题描述】:

我一直在互联网上搜索,试图找出如何将图标图像添加到我的 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);

这是我得到的错误: Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException at javax.swing.ImageIcon.<init>(ImageIcon.java:205) at MainJFrame.<init>(MainJFrame.java:39) at MainJFrame$1.run(MainJFrame.java:18) at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251) at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:727) at java.awt.EventQueue.access$200(EventQueue.java:103) at java.awt.EventQueue$3.run(EventQueue.java:688) at java.awt.EventQueue$3.run(EventQueue.java:686) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) at java.awt.EventQueue.dispatchEvent(EventQueue.java:697) at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138) at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)

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

【问题讨论】:

  • 出现什么错误?
  • 你能把你的错误粘贴在这里吗?
  • 好吧,当我尝试 window.setIconImage(ImageIO.read("src/slime.png"));我收到错误 ImageIO 类型中的方法 read(File) 不适用于参数 (String)
  • 如果您还没有阅读过,请阅读底部的说明。 :)
  • 好吧,setIconImage(ImageIO.read("..."));您所指的不在您的帖子中;实际上,您调用 setIconImage 时根本没有任何参数。网上有很多(很多)示例说明如何执行此操作,我不知道为您提供更多随机示例是否会有所帮助。如果您想知道自己做错了什么,请将代码减少到显示问题所需的最低限度,并告诉我们运行它时会发生什么,以及您在该代码中尝试了什么,而不仅仅是我们随后拥有的随机语句猜测一下。

标签: java swing jframe jpanel imageicon


【解决方案1】:

使用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);

如果您想将图像大小调整为窗口大小,请执行此操作(将代码添加到窗口之前):

Image newimg = img.getScaledInstance(window.getWidth() , window.getHeight(), java.awt.Image.SCALE_SMOOTH);// resizing image to the window size

编辑:

当然,您不能在 public static void main() 方法中使用 getClass(),您应该将代码放在 non-static 某处,例如类构造函数。

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

try-catch 阻止检查您是否正确获取图像总是好的。尽管在这种情况下,从包中获取代码并不是必需的,但如果您要从项目外部获取任何资源,请确保您的打开过程。

【讨论】:

  • 错误:无法从 Object 类型对非静态方法 getClass() 进行静态引用
  • @user1952565 从static main 中删除您的代码并将它们放入另一个类并从中创建一个实例。
  • @user1952565 你收到了吗?
  • 当我尝试运行 pastebin.com/MM2cFNki @sajjadG 时,这是我的代码和错误
  • @user1952565 将您的输出放在您的问题中。这有助于排除故障。
【解决方案2】:

试试这个,它必须工作

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

你写的,

newImageIcon()

这可能是一种方法,因为它是为您编译的。我认为您可能必须将其写为new ImageIcon() 这可能是问题所在。未创建 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();
            }
        });
    }
}

【讨论】:

  • 无法从 Object 类型对非静态方法 getClass() 进行静态引用
  • 所有组件默认为流式布局。
【解决方案3】:

首先,出于安全考虑,不要尝试在 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() 参数中的 newImageIcon 之间放置一个空格。所以整个构造函数应该是这样的:

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 中工作,请确保该文件位于主包之外的文件夹中。除此之外,你应该很好。

【讨论】:

    【解决方案4】:

    试试这个。与 sajjad 的答案几乎相同,只是在使用之前检查以确保图像 url 不为空。

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

    【讨论】:

      猜你喜欢
      • 2015-04-23
      • 2013-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-12
      • 1970-01-01
      • 2020-05-06
      • 2017-04-29
      相关资源
      最近更新 更多