Java 将图像添加到正在绘制到JPanel类上的节点

Java 将图像添加到正在绘制到JPanel类上的节点,java,swing,jpanel,Java,Swing,Jpanel,我正在做一个Java游戏。我有一个扩展JPanel的Board类,并使用paintComponent(Graphics g){在屏幕上绘制了一个节点jim,这是Ball类的对象实例。我可以使用箭头键在JPanel上移动Ball对象 我希望加载一个图像,而不是将球对象表示为红色正方形 Board类扩展了JPanel: jim=新球(0,0,50,50,“jim”); 球类: public class Ball extends Component { int x, y, w, h;

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

我希望加载一个图像,而不是将球对象表示为红色正方形

Board类扩展了JPanel:

jim=新球(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);
    }
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);
    }
}
不过,它并没有在红场的顶部绘制,甚至根本没有出现

我还尝试将图像附加为JLabel…以下是Ball类中的代码:

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);
    }
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,因此我无法将标签添加到对象中

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

     if (imgType == "jim")   ==>>   if ("jim".eqauls(imgType))
    
  • 您应该从URL而不是文件对象读取。可以使用
    getClass().getResource()
    获取URL

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

  • 建议在
    JPanel
    上绘制,并覆盖其
    paintcomponent
    JComponet
  • 实际上,您从未使用构造函数中的变量来绘制`

    g.drawImage(jimImg, x, y, w, h, this);
    
  • 使用绘画时,应覆盖
    JPanel
    getPreferredSize
    ,以便框架将相应地调整大小


  • 下面是一个运行中的示例,请记住我的文件结构

        ProjectRoot/src/resources/image.png 
    


    根据操作指令进行编辑


    “我的类的结构方式:Main类添加JFrame,我在JFrame中添加了一个新的Board类对象(Board类扩展了JPanel)。然后我有Board类扩展了JPanel,它添加了一个新的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);
        }
    }
    

    我的类的结构方式:Main类添加JFrame,我在JFrame中添加了一个新的Board类对象(Board类扩展了JPanel)。然后我有Board类扩展了JPanel,它添加了一个新的Ball对象,并有键盘方法等等。这样我就可以移动球。然后Ball类只是一个带有get/set方法
    getX(),setX()的节点
    等等。所以我不能在不扩展JPanel的情况下向Ball类添加图像?所有这些想法都可以考虑,以实现您所需要的。这只是一个基于上述代码的示例。看起来您根本不需要将Ball作为组件。与其将Ball作为组件,不如将其作为常规类。一个d在你的
    Board JPanel
    paintComponent
    中,只要为你看到我编辑的每个球调用
    ball.paint()
    。我用一个
    ball
    类编辑它,这个类不是
    Component
    ,并使用
    Board
    类进行绘制。好的,我是我的Board类,我做了
    jim.paint(g);
    (jim是Ball对象的名称,上面的红色块),在Ball类中,我做了
    Image jimImg=ImageIO.read(新文件(“resources/UTC.png”);
    ,然后
    public void paint(Graphics g){g.drawImage(jimImg,0,0,null);}
    (与上面使用
    ImageIO.read
    try/catch的方式一样,它在线程“main”中抛出了
    异常)java.lang.IllegalArgumentException:input==null!
    error)