繁体   English   中英

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

[英]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的“问题”是

  1. 如果加载失败,它不会报告任何错误
  2. 它在第二个线程中加载图像,这意味着您(很容易)不知道它何时可用

手头的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM