【问题标题】:Image as background and paintComponent图像作为背景和paintComponent
【发布时间】:2013-03-13 07:55:15
【问题描述】:

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

我是 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;
            } 
    }
    }
}

【问题讨论】:

    标签: java swing background jpanel paintcomponent


    【解决方案1】:

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

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

    在这种情况下,当您使用自定义paint 方法时,您不会调用super.paint(g),因此不会绘制带有ImageJLabel

    创建的Image是空白的:

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

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

    结果:没有背景图片。

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

    现在Swing 正在调用默认的paint 实现,以确保绘制所有子组件,但现在您没有调用fillOval 方法,最终结果:背景Image,没有球。

    下一步:

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

    dbImage = ImageIO.read(new File("MyImage.jpg"));
    

    然后在基于JComponent 的新类中:

    @Override
    protected void paintComponent(Graphics g) {
       super.paintComponent(g);
       g.drawImage(dbImage, 0, 0, getWidth(), getHeight(), this);
       g.fillOval(x, y, 15, 15);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-24
      • 2013-03-19
      • 2010-11-09
      • 1970-01-01
      • 1970-01-01
      • 2011-07-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多