在事件上创建正方形

时间:2013-03-04 12:23:51

标签: java swing jpanel paint

我正在尝试创建一个与蛇相同系统的游戏。我创建了一个窗口,上面有一个JPanel,给它一个背景和绘制的线条,向用户显示正方形。

Board为600x600(全部为601x601可见)。 正方形是20x20。

现在我正在尝试添加一种方法将彩色方块放在纸板上,并检测是否有理想的彩色方块。

public class CreateWindow extends JFrame {

    JPanel GameArea;
    static JLayeredPane Java_Window;
    Image Background;

    public void CreateWindow() {
        Dimension Panel_Size = new Dimension(800, 800);
        this.setSize(800,800);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible( true );
        this.setTitle("LineRage");
        getContentPane().setBackground(Color.white); 

        Java_Window = new JLayeredPane();
        this.add(Java_Window);
        Java_Window.setPreferredSize(Panel_Size);

        GameArea = new JPanel()
        {
            @Override
            public void paint(Graphics g) {
                g.setColor(Color.BLACK);
                g.fillRect(0,0,601,601);

                g.setColor(Color.GRAY);
                // Cut map into sections
                int x;
                //draw vertical lines
                for(x = 0; x < 31; x++) {
                    g.drawLine(x*20,0,x*20,600);
                }    
                //draw horizontal lines
                for(x = 0; x < 31; x++) {
                    g.drawLine(0,x*20,600,x*20);
                }     
            }

            public void PaintSquare (int x,int y) {
                //Check if square painted

                //Paint square
                Rectangle rect = new Rectangle(x, y, 20, 20);
                GameArea.add(rect);
            }
        };
        Java_Window.add(GameArea, JLayeredPane.DEFAULT_LAYER);
        GameArea.setBounds(20, 20, 601, 601);
        GameArea.setVisible(true);
    }
}

所以Java_Window(800x800)有白色背景, Game_Area(601x601)有黑色背景,沿着它排列着32条直线,将它划分为正方形。

public void PaintSquare (int x, int y) {
    //Check if square painted

    //Paint square
    Rectangle square = new Rectangle(x, y, 20, 20);
    GameArea.add(square);
}

PaintSquare将从另一个对象(主游戏)调用并检查方块的背景,如果它是空的,它将在其上绘制一个正方形(20x20)。

2 个答案:

答案 0 :(得分:1)

你的确切问题尚不清楚,但这里有一些指示:

  • 在Swing中进行自定义绘制时,使用paintComponent而不是paint。别忘了拨打super.paintComponent(g)
  • java.awt.Rectangle不是来自JComponent(或Component),因此无法添加到容器中。
  • 采取的一种方法是使用fillRect和“绘制”方块:

此外,在Java中,方法以小写字母开头。将此和前一点一起添加,您可以这样做:

public void paintSquare(Graphics g, int x, int y) {
   g.fillRect(x, y, 20, 20);
}

此处,paintSquare方法将从paintComponent调用。

答案 1 :(得分:0)

遵循Reimeus'建议,此外,您还需要创建GUI模型。

定义一个与游戏模型类中的游戏板大小相同的矩形数组。

Rectangle[][] board;

这样,您可以在模型类中测试重叠的蛇,而不必担心您已绘制的内容。

您的paintComponent方法变得非常简单。

protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    model.draw(g);
}

有关更全面的解释,请参阅this answer