ImageIcon.paintIcon 不在 JPanel 上绘制图像
ImageIcon.paintIcon does not draw image on JPanel
我正在尝试在 JPanel
上绘制 .png
。我使用 ImageIcon
构造函数导入它,并在我的自定义面板的 paintComponent
.
中绘制它
我的sscce:
package mypackage;
import java.awt.Graphics;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class MyPanel extends JPanel {
static JFrame frame;
static MyPanel panel;
static ImageIcon icon;
public static void main(String[] args) {
icon = new ImageIcon(MyPanel.class.getResource("MyImage.png"));
frame = new JFrame();
panel = new MyPanel();
frame.setSize(500, 500);
frame.add(panel);
frame.setVisible(true);
frame.repaint();
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
icon.paintIcon(panel, g, 100, 100);
}
}
我希望图像(只是白色背景上的几个形状)显示在面板上的 (100, 100)
处。相反,一个空白屏幕:
没有错误发生意味着程序正在正确找到文件。
图像在我的 Eclipse 项目中,与 class:
在同一个包中
为什么会这样?我该如何解决?
由于代码看起来正确,我建议资源加载不正确。
将 png 文件放在类路径中。例如。我会有一个目录:
~/ProjectRoot/resources/mypackage/
然后在类路径中包含资源。 In eclipse you can setup the classpath via
Project -> Properties -> Java Build Path -> Add Class Folder
BufferedImage img =
ImageIO.read(MyPanel.class.getResourceAsStream("MyImage.png"));
如果找不到图像,则会引发异常。你可以用它来制作一个ImageIcon。
当您使用 ImageIcon 从文件中读取图像时,您不会得到读取是否成功的指示。
这是我使用 ImageIO 读取图像的 GUI:
这是图像,与 Java 源位于同一目录中:
这是您的代码,其中我使用 ImageIO 读取来读取图像,并在 paintComponent 方法中绘制图像。
package com.ggl.testing;
import java.awt.Graphics;
import java.awt.Image;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class MyPanel extends JPanel {
private static final long serialVersionUID = -9008812738915944216L;
private static JFrame frame;
private static MyPanel panel;
private static Image image;
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
image = getImage();
frame = new JFrame();
panel = new MyPanel();
frame.setSize(500, 500);
frame.add(panel);
frame.setVisible(true);
}
});
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(image, 100, 100, MyPanel.this);
}
private static Image getImage() {
Image image = null;
try {
image = ImageIO.read(MyPanel.class.getResource("maze.jpg"));
} catch (IOException e) {
e.printStackTrace();
}
return image;
}
}
我正在尝试在 JPanel
上绘制 .png
。我使用 ImageIcon
构造函数导入它,并在我的自定义面板的 paintComponent
.
我的sscce:
package mypackage;
import java.awt.Graphics;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class MyPanel extends JPanel {
static JFrame frame;
static MyPanel panel;
static ImageIcon icon;
public static void main(String[] args) {
icon = new ImageIcon(MyPanel.class.getResource("MyImage.png"));
frame = new JFrame();
panel = new MyPanel();
frame.setSize(500, 500);
frame.add(panel);
frame.setVisible(true);
frame.repaint();
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
icon.paintIcon(panel, g, 100, 100);
}
}
我希望图像(只是白色背景上的几个形状)显示在面板上的 (100, 100)
处。相反,一个空白屏幕:
没有错误发生意味着程序正在正确找到文件。
图像在我的 Eclipse 项目中,与 class:
在同一个包中为什么会这样?我该如何解决?
由于代码看起来正确,我建议资源加载不正确。
将 png 文件放在类路径中。例如。我会有一个目录:
~/ProjectRoot/resources/mypackage/
然后在类路径中包含资源。 In eclipse you can setup the classpath via
Project -> Properties -> Java Build Path -> Add Class Folder
BufferedImage img =
ImageIO.read(MyPanel.class.getResourceAsStream("MyImage.png"));
如果找不到图像,则会引发异常。你可以用它来制作一个ImageIcon。
当您使用 ImageIcon 从文件中读取图像时,您不会得到读取是否成功的指示。
这是我使用 ImageIO 读取图像的 GUI:
这是图像,与 Java 源位于同一目录中:
这是您的代码,其中我使用 ImageIO 读取来读取图像,并在 paintComponent 方法中绘制图像。
package com.ggl.testing;
import java.awt.Graphics;
import java.awt.Image;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class MyPanel extends JPanel {
private static final long serialVersionUID = -9008812738915944216L;
private static JFrame frame;
private static MyPanel panel;
private static Image image;
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
image = getImage();
frame = new JFrame();
panel = new MyPanel();
frame.setSize(500, 500);
frame.add(panel);
frame.setVisible(true);
}
});
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(image, 100, 100, MyPanel.this);
}
private static Image getImage() {
Image image = null;
try {
image = ImageIO.read(MyPanel.class.getResource("maze.jpg"));
} catch (IOException e) {
e.printStackTrace();
}
return image;
}
}