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