作为背景和paintComponent的图象

时间:2013-03-13 07:55:16

标签: java swing background jpanel paintcomponent

我只是想为大学制作一个游戏,这是一个玩家用键盘导航以通过迷宫的球。我唯一坚持的是我的背景是一个迷宫的图像,当我添加“球”它重新绘制背景(defualt颜色,没有图像)当我评论出油漆和油漆组件时,迷宫背景又回来了,但当然没有球。

我是java的新手,我已经搜索了这个,并且看不到我已经拥有的代码的良好灵魂。是setOpaque吗? isOpaque?....即使是正确的方向也是不透明的?

一旦我得到这个......我完全理解使用碰撞检测来检测与迷宫“墙”的碰撞

试图弄清楚这一点,对java来说是个新手,可以让一个成年人哭泣。

main.java

public class Main{

public static void main (String[] args){

    //System.out.println("Start of the Game");

    GameFrame game1 = new GameFrame();
}

JavaGame.java

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import java.io.File;
import java.io.IOException;


public class GameFrame extends JFrame{        

private int frameWidth = 240, frameHeight =315;
    int x, y;
    private Image dbImage;
    private Graphics dbg;

//Below is the constructor        

public GameFrame(){          

        super("OperationMaze!");
        addKeyListener(new AL());
        setResizable(false);
        //setTitle("OperationMaze!2");
        //setSize(250, 302);
        setSize(frameWidth, frameHeight); //Set height and width
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);            


            //Because of opening file, there needs to be a try catch just incase there is an error opening.
            //Plus java won't let you unless you try catch.
    try{

                setContentPane(new JLabel(new ImageIcon(ImageIO.read(new File("C:/Documents and Settings/brando/My Documents/NetBeansProjects/GameFrame/src/maze.jpg")))));

    }   catch (IOException e) {
                e.printStackTrace();                    
                }       


        //Show the frame


        setVisible(true);
        //setOpaque(false);    
        y = 35;
        x = 15;
}

    public void paint(Graphics g) {

       dbImage = createImage(getWidth(), getHeight());
       dbg = dbImage.getGraphics();
       paintComponent(dbg);
       g.drawImage(dbImage, 0, 0, this);           
    }

    public void paintComponent(Graphics g) {                

        g.fillOval(x, y, 15, 15);
        //g.setOpaque(false);

        repaint();        
    }   

   // private void setOpaque(boolean b) {
   //     throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.

   // }

    public class AL extends KeyAdapter { 

        public void keyPressed(KeyEvent e) {
            int keyCode = e.getKeyCode();
            if(keyCode == e.VK_LEFT) {
                if(x <= 5)
                    x = 5;
                else 
                    x += -5;
            }
            if(keyCode == e.VK_RIGHT) {
                if(x >= 230)
                    x = 230;
                else
                    x += +5;
            } 
            if(keyCode == e.VK_UP) {
                if(y <= 23)
                    y=23;
                else
                    y += -5;
            } 
            if(keyCode == e.VK_DOWN) {
                if(y >= 277)
                    y = 277;
                else
                    y += +5;
            } 
    }
    }
}

1 个答案:

答案 0 :(得分:2)

好的,让我们看看这里出了什么问题:

  

当我添加“球”时,它会重新绘制背景(默认颜色,没有图像)

在这种情况下,当您使用自定义paint方法时,不会调用super.paint(g),因此JLabel Image不会被绘制。< / p>

创建的Image为空:

dbImage = createImage(getWidth(), getHeight());

Graphics提供convenient overloaded method of drawImage,允许您指定宽度和高度,以避免这样做。)

结果:没有背景图片。

  

当我注释掉油漆和油漆组件时,迷宫背景又回来了,但当然没有球。

现在Swing正在调用默认的paint实现,该实现可确保绘制所有子组件,但现在您没有调用fillOval方法,最终结果为:后台{{1} ,没有球。

下一步:

要允许Swing执行自定义绘制工作,您需要覆盖 Image而不是直接调用它。但是,这不能在像paintComponent这样的顶级容器中完成。在该新组件中对JFrame进行子类化并覆盖JComponent将允许Swing调用该方法,而无需直接执行。添加paintComponent将允许编译器检查 确实覆盖了该方法。当您打算绘制@Override时,您只需加载Image并保存参考,以便在需要绘制时使用:

Image

然后在新的基于dbImage = ImageIO.read(new File("MyImage.jpg")); 的课程中:

JComponent