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

时间:2014-01-19 03:22:23

标签: java swing jpanel

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

我希望加载一个图像,而不是将Ball对象表示为红色方块。

Board class扩展了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);
    }

它并没有画在红色方块的顶部,甚至没有出现。

enter image description here

我还尝试将图像附加为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 个答案:

答案 0 :(得分:2)

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

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

    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. 使用绘画时,您应该覆盖getPreferredSize的{​​{1}},以便框架相应地调整大小。


  7. 这是一个有效的运行示例。请记住我的文件结构如

    JPanel

        ProjectRoot/src/resources/image.png 
    

    编辑

    以回应OP通知

      

    “我的类的结构方式:主类添加JFrame,我在其中添加一个新的Board类对象到JFrame(Board类扩展JPanel)。然后我有Board类扩展JPanel,它添加了一个新的Ball对象并且有键盘方法等...所以我可以移动Ball。然后Ball Class只是一个带有get / set方法getX(),setX()等的节点。所以我无法在没有扩展的情况下向Ball类添加图像JPanel的?“

    看起来你根本不需要球作为组件。而不是让球成为一个组成部分,只需使它成为常规课程。在你的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 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);
                }
            });
        }
    }