[英]Graphics 2D not drawing images in Java
我正在关注 Java 课程,目前的想法是使用 Java Graphics2D 绘制图像。 我正在一步一步地按照步骤进行操作,但它似乎没有画出任何东西。 面板显示在框架内,一切都正确,但未绘制图像。 我正在使用 Java 15 课程是 Java 13。
JPanel class 代码:
public class MyPanel extends JPanel implements ActionListener {
Image ball;
int x = 0;
int y = 0;
MyPanel(){
this.setPreferredSize(new Dimension(PANEL_WIDTH,PANEL_HEIGHT));
this.setBackground(Color.BLACK);
ball = new ImageIcon("ball.png").getImage();
}
public void paint(Graphics g){
Graphics2D G2D = (Graphics2D) g;
G2D.drawImage(ball,x,y,null);}
JFrame class 代码:
public class MyFrame extends JFrame{
MyPanel panel;
MyFrame(){
panel = new MyPanel();
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.add(panel);
this.pack();
this.setLocationRelativeTo(null);
this.setVisible(true);
}
主要class代码:
new MyFrame();
我挑选了大部分相关代码。
首先,我建议阅读在 AWT 和 Swing中进行自定义绘画和绘画,以更好地了解 Swing 中的绘画应该如何工作。
然后我建议通读阅读/加载图像
ImageIcon
的“问题”是
手头的ImageIO
如果无法加载图片会抛出错误,这更容易诊断,并且只有在图片完全加载并可用后才会返回。
开始时可能很难掌握的一个概念是“嵌入式”资源的概念。 Java 允许您使用 package “资源”以及您的代码。 这些资源存在于您的程序 class 路径的上下文中,与处理外部文件相比,它更容易加载。
查看在可运行的 Jar 中打包和访问运行时资源以了解一些基础知识。
根据您使用的 IDE,通常很容易将这些资源“复制”到您的项目/src 中,并允许 IDE 到 ZEFE90A8E604A7C840E88D03A67F6B7 本身。
像这样的问题的问题是,任何人都很难真正诊断出来,因为图像可能没有加载的原因有很多,而解决方案通常是反复试验之一。
我,我会先画一些线条/矩形,并确保调用了paint
。 然后我会查看图像大小之类的东西,以确保它不是0x0
之类的东西。
这是一个基于我上面所做评论的简单可运行示例。 我正在使用 NetBeans 并且图像存储在/images
package 下的“源包”(因此,连同其他源代码)
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class Test {
public static void main(String[] args) {
new Test();
}
public Test() {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame();
frame.add(new TestPane());
frame.pack();
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
private BufferedImage beachBall;
public TestPane() {
try {
beachBall = ImageIO.read(getClass().getResource("/images/BeachBall.png"));
} catch (IOException ex) {
ex.printStackTrace();
}
}
@Override
public Dimension getPreferredSize() {
return new Dimension(200, 200);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if (beachBall == null) {
return;
}
Graphics2D g2d = (Graphics2D) g.create();
int x = (getWidth() - beachBall.getWidth()) / 2;
int y = (getHeight() - beachBall.getHeight()) / 2;
g2d.drawImage(beachBall, x, y, this);
g2d.dispose();
}
}
}
看起来您的图像确实没有加载。
正如@MadProgrammer 刚刚所说, new ImageIcon("ball.png")
不会引发任何错误,并且getImage()
将始终返回某些内容(不是null
),即使文件未正确加载也是如此。
为确保您的图像可用,您可以尝试ball.getWidth(null)
,如果它返回-1
,则说明出现问题。
您可以使用System.getProperty("user.dir")
检查 JVM 使用的根路径(“执行”位置),图像文件必须完全在此文件夹中。
我用 java 1.8 尝试了你的代码,它运行良好。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.