我一直在互联网上搜索,试图找出如何将图标图像添加到我的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());但这不起作用,使我在屏幕上打印的其他图像消失。
答案 0 :(得分:0)
使用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
修改强>
当然,您无法在getClass()
方法中使用public static void main()
,您应该将代码放在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
阻止检查您是否正确获取图像总是好的。虽然在这种情况下,如果您从包中获取代码并不是必需的,但如果您要从项目外部获取任何资源,请确保您的打开过程。
答案 1 :(得分:0)
试试这个。与sajjad的答案完全相同只是检查以确保图像url在使用之前不为null。
java.net.URL imageUrl = YourClass.class.getResource("/IconImage.png");
if(imageUrl != null){
setIconImage(new ImageIcon(imageUrl));
}
答案 2 :(得分:0)
试试这个,它必须工作
frame.setIconImage(Toolkit.getDefaultToolkit().getImage(getClass().getResource("/src/slime.gif")));
你写道,
newImageIcon()
这可能是一种方法,因为它为您编译。我想你可能要把它写成new ImageIcon()
这可能是问题所在。 <{1}}尚未创建。
简单地说,为什么不使用
javax.swing.ImageIcon
这是完整的代码,
setIconImage(imageIcon.getImage());
答案 3 :(得分:0)
首先,出于安全原因,请勿尝试在主方法中创建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
}
然后在其中放入相同的代码,但在new
参数中的ImageIcon
和setIconImage()
之间放置一个空格。所以整个构造函数应该如下所示:
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加载图像。这不适用于applet,因为它会给你一个安全错误。
window.setIconImage(ImageIO.read(new File("folder/to/file.png")));
您还需要在throw / catch块中包围此行,如果您在eclipse中工作,请确保该文件位于主程序包之外的文件夹中。除此之外你应该是好的。