2D图形在Java中不绘制图像

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=新图像图标

我正在学习Java课程,目前的想法是使用Java Graphics2D绘制图像。我正在一个接一个地遵循这些步骤,但它似乎没有画出任何东西。面板显示在框架内,一切正常,但未绘制图像。我正在使用Java15,课程是Java13

JPanel类代码:

公共类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();
            }
    
        }
    }