2D图形在Java中不绘制图像
我正在学习Java课程,目前的想法是使用Java Graphics2D绘制图像。我正在一个接一个地遵循这些步骤,但它似乎没有画出任何东西。面板显示在框架内,一切正常,但未绘制图像。我正在使用Java15,课程是Java13 JPanel类代码:2D图形在Java中不绘制图像,java,swing,jpanel,Java,Swing,Jpanel,我正在学习Java课程,目前的想法是使用Java Graphics2D绘制图像。我正在一个接一个地遵循这些步骤,但它似乎没有画出任何东西。面板显示在框架内,一切正常,但未绘制图像。我正在使用Java15,课程是Java13 JPanel类代码: 公共类MyPanel扩展JPanel实现ActionListener{ 形象球; int x=0; int y=0; 我的小组(){ 此.setPreferredSize(新尺寸(面板宽度、面板高度)); 这个.背景(颜色.黑色); ball=新图像图标
公共类MyPanel扩展JPanel实现ActionListener{
形象球;
int x=0;
int y=0;
我的小组(){
此.setPreferredSize(新尺寸(面板宽度、面板高度));
这个.背景(颜色.黑色);
ball=新图像图标(“ball.png”).getImage();
}
公共空间涂料(图g){
Graphics2D G2D=(Graphics2D)g;
G2D.drawImage(ball,x,y,null);}
JFrame类代码:
公共类MyFrame扩展了JFrame{
我的小组;
MyFrame(){
panel=新的MyPanel();
此.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
本条添加(面板);
这个包();
此.setLocationRelativeTo(空);
此.setVisible(true);
}
主要类别代码:
newmyframe();
我挑选了大部分相关代码。首先,我建议通读一遍,以便更好地了解Swing中的绘画应该如何工作 然后我建议通读一遍
ImageIcon
的“问题”是
ImageIO
如果无法加载图像,则手持设备会抛出错误,这更容易诊断,并且只有在图像完全加载并可用后才会返回
一个在开始时很难理解的概念是“嵌入式”资源的概念。Java允许您将“资源”与代码打包在一起。这些资源位于程序类路径的上下文中,与处理外部文件相比,更易于加载
看看一些基础知识
根据您使用的IDE,通常很容易将这些资源“复制”到项目/src中,并允许IDE自行打包
这样一个问题的问题是,任何人都很难真正诊断,因为有太多的原因导致图像可能没有加载,解决方案通常是反复尝试
在我看来,我首先要画一些线/矩形,确保调用了paint
。然后我会查看图像的大小,以确保它不像0x0
可运行示例
这是一个基于我上面的评论的简单的可运行示例。我使用NetBeans,图像存储在/images
包下的“源代码包”(以及其他源代码)中
看起来您的图像确实没有加载。
正如@MadProgrammer刚刚告诉我们的,
newimageicon(“ball.png”)
不会引发任何错误,getImage()
将始终返回某些内容(而不是null
),即使文件没有正确加载
要确保图像可用,可以尝试ball.getWidth(null)
,然后
如果返回-1
,则表示出现了问题。您可以使用
System.getProperty(“user.dir”)
检查JVM使用的根路径(“执行”位置),映像文件必须正好位于该文件夹中
我用java 1.8尝试了你的代码,效果很好。你确定“ball.png”加载正确吗?尝试检查ball是否为null。这是否回答了你的问题?ball.png正确加载并包含在项目文件夹中,所以我不需要绝对路径,球也不是空的,所以我不知道。是的,那个网站对我没有帮助,bcz首先它使用另一种方式,其次是关于绘制矩形,矩形与我一起工作。非常感谢您的努力。
新图像图标(“ball.png”)
引用了文件系统中的一个文件,该文件必须位于执行代码的同一位置。它实际上位于项目文件夹中,它位于同一位置,但不起作用。非常感谢!结果是,该图像位于项目文件夹中,但不在其根目录中的out文件夹中的某个位置,这是因为我将其拖动并放入IDE中的项目中。
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();
}
}
}