繁体   English   中英

将图像添加到要绘制到JPanel类上的节点

[英]Add image to node that is being painted onto JPanel class

我正在制作Java游戏。 我有一个扩展JPanel的Board类,并使用paintComponent(Graphics g) {在屏幕上绘制了一个节点jim ,它是Ball类的对象实例。 我可以使用箭头键在JPanel上移动Ball对象。

我不想将Ball对象表示为红色正方形,而是要加载图像。

Board类扩展了JPanel:

jim = new Ball(0, 0, 50, 50, "jim");

球类:

public class Ball extends Component {
    int x, y, w, h;
    BufferedImage jimImg;

    public Ball(int xLoc, int yLoc, int width, int height, String imgtype) throws IOException {
        x = xLoc;
        y = yLoc;
        w = width;
        h = height;
        jimImg = ImageIO.read(new File("resources/Jim.png"));
        loadImages(imgtype);

    }
    public void paint(Graphics g) {
        g.drawImage(jimImg, 200, 0, null);
    }

它没有画在红色方块上,甚至根本没有出现。

在此处输入图片说明

我还尝试过将图像作为JLabel追加... Ball类中的以下代码:

public void loadImages(String imgType) throws IOException {

    if (imgType == "jim") {
        JLabel utc = new JLabel("test");
        ImageIcon utcImg = new ImageIcon("resources/Miller.png");
        utc.setIcon(utcImg);
    }
}

但是由于Ball类不是JPanel,所以无法将标签添加到对象。

  1. 不要将字符串与==进行比较,请使用equals

      if (imgType == "jim") ==>> if ("jim".eqauls(imgType)) 
  2. 您应该从URL而不是File对象读取。 可以使用getClass().getResource()获得URL。 例如

     jimImg = ImageIO.read( Ball.class.getResource("/resources/Jim.png")); 
  3. 您应该在构造函数中使用try/catch ,这样以后在实例化Ball时就不必再使用了。

  4. 可以在JPanel上绘画并覆盖其paintCompoentJComponet
  5. 您从不真正使用构造函数中的变量来绘制`

     g.drawImage(jimImg, x, y, w, h, this); 
  6. 使用绘画时,您应该覆盖JPanelgetPreferredSize ,以便框架相应地调整其大小。


这是一个有效的示例。 请记住,我的文件结构看起来像

    ProjectRoot/src/resources/image.png 

import java.awt.Dimension;
import java.awt.Graphics;
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 Ball extends JPanel {

    int x, y, w, h;
    BufferedImage jimImg;

    public Ball(int xLoc, int yLoc, int width, int height) {
        x = xLoc;
        y = yLoc;
        w = width;
        h = height;
        try {
            jimImg = ImageIO.read(
                    Ball.class.getResource("/resources/stackoverflow5.png"));
            System.out.println(jimImg);
        } catch (IOException ex) {
            ex.printStackTrace();
        }

    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(jimImg, x, y, w, h, this);
    }

    public Dimension getPreferredSize() {
        return new Dimension(400, 400);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                JFrame frame = new JFrame();
                frame.add(new Ball(50, 50, 100, 100));
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.pack();
                frame.setVisible(true);
            }
        });
    }
}

编辑

回应OP的赞美

“类的结构方式:主类添加了JFrame,在其中向JFrame添加了新的Board类对象(Board类扩展了JPanel)。然后,Board类扩展了JPanel,后者添加了新的Ball对象并具有键盘方法,等等...所以我可以移动Ball。然后Ball类只是一个具有get / set方法getX(),setX()等的节点。因此,如果不扩展JPanel,就无法向Ball类添加图像吗?”

看起来根本不需要球成为组件。 与其使球成为一个组件,不如使它成为普通班。 在Board JPanel的paintComponent中,只需为每个球调用ball.paint()即可。

 import java.awt.Dimension; import java.awt.Graphics; 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 Board extends JPanel { Ball ball = new Ball(50, 50, 200, 200); @Override public void paintComponent(Graphics g) { super.paintComponent(g); ball.drawBall(g); } public Dimension getPreferredSize() { return new Dimension(400, 400); } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { JFrame frame = new JFrame(); frame.add(new Board()); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.pack(); frame.setVisible(true); } }); } } class Ball { int x, y, w, h; BufferedImage jimImg; public Ball(int xLoc, int yLoc, int width, int height) { x = xLoc; y = yLoc; w = width; h = height; try { jimImg = ImageIO.read( Board.class.getResource("/resources/stackoverflow5.png")); System.out.println(jimImg); } catch (IOException ex) { ex.printStackTrace(); } } public void drawBall(Graphics g) { g.drawImage(jimImg, x, y, w, h, null); } } 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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