[英]JFrame Icon Image Not Working
我一直在互联网上搜索,试图找出如何将图标图像添加到我的 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)
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()); 但这不起作用,并使我打印在屏幕上的其他图像消失。
使用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
块以检查您是否正确获取图像总是好的。 尽管在这种情况下,当您从包中获取代码时并不是必需的,但是如果您要从项目外部获取任何资源,请确保您的打开过程。
试试这个。 与 sajjad 的答案非常相似,只是在使用之前检查以确保图像 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()
这可能是一种方法,因为它是为您编译的。 我认为您可能必须将其编写为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();
}
});
}
}
首先,为了安全起见,不要尝试在 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 中工作,请确保该文件位于主包之外的文件夹中。 除此之外,你应该很好。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.