(Java)不显示绘制的矩形

时间:2015-03-19 16:43:50

标签: java swing graphics awt

所以正在开展一个学校项目,我想绘制一个由矩形组成的游戏板,这些游戏板保存在一个数组中。我设法做到了这一点,但只有最后在Panel上绘制的Rectangle Stays。我非常绝望,我不知道我的错误在哪里。

Field是4x5字段。坐标保存在平铺类中:

前两个代表左上角

最后两个代表它的右下角

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;

public class quoVadis{
    public static void main(String[] args) {
        new Frame();
    }
} 

class Tile {
    Random rGen = new Random();
    int sX,sY,eX,eY;
    Color farbe;
    public Tile(int sX, int sY,int eX,int eY){
        this.sX = sX;
        this.sY = sY;
        this.eX = eX;
        this.eY = eY;
        farbe = new Color(rGen.nextInt(156)+100,rGen.nextInt(156)+100,rGen.nextInt(156)+100);
    }
}

class Frame extends JFrame{

    private Game game;
        final int GAMESIZE = 400;
        final int PANELSIZE = GAMESIZE/5;
    public Frame() { 

        super("Quo Vadis");     
        this.setSize(GAMESIZE, GAMESIZE*5/4);
        this.setLocation(50, 50);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        game = new Game(GAMESIZE, PANELSIZE);
        game.setLayout(null);
        game.setBackground(Color.WHITE);
        this.getContentPane().add(game);


        this.setVisible(true);
   }

    }
class Game extends JPanel{
    int GAMESIZE;
    int PANELSIZE;
    private Tile field[][]=new Tile[4][5]; 
    Random rGen = new Random(4711);
    Tile stein;

    public Game(int g, int p) {
        GAMESIZE = g;
        PANELSIZE = p;

//错误必须出现在以下部分:

        int idx=0;  
        for(Tile i:levels){
            for(int j = i.sX; j <= i.eX; j++){
                for(int k = i.sY; k <= i.eY; k++){
                    field[j][k] = levels[idx];
                }
            }
            idx++;
         }

            for(int k = 0; k <= 4; k++){
                for(int j = 0; j <= 3; j++){
                    if(field[j][k]==null)continue;
                    stein=field[j][k];
                    draw((field[j][k].sX * PANELSIZE) , (field[j][k].sY * PANELSIZE) , ((((field[j][k].eX-field[j][k].sX) + 1) * PANELSIZE) -1),  ((((field[j][k].eY-field[j][k].sY)+ 1) * PANELSIZE) -1));
                }

            }

        this.setVisible(true);
    }

    int rx, ry,rdx,rdy;
    private void draw(int a, int b, int c, int d){
        rx=a;
        ry=b;
        rdx=c;
        rdy=d;
        repaint(rx,ry,rdx,rdy);
    }

    public void paintComponent(Graphics g) {

      super.paintComponent(g);
      g.setColor(stein.farbe);
      g.fillRect(rx, ry, rdx, rdy);
   }
    Tile[] levels = {
        new Tile(1,0,2,1),
        new Tile(0,0,0,1),
        new Tile(3,0,3,1),
        new Tile(0,2,0,3),
        new Tile(1,2,2,2),
        new Tile(3,2,3,3),
        new Tile(0,4,0,4),
        new Tile(1,3,1,3),
        new Tile(2,3,2,3),
        new Tile(3,4,3,4),
        };
}

我已经用数字检查了矩形的位置,它们在各方面都是正确的,因此它们不会重叠或类似。

抱歉我的英语不好,这不是我的主要语言。

1 个答案:

答案 0 :(得分:1)

每次都需要在paintComponent方法内绘制每个矩形。

目前,您正在为一个矩形调用draw方法,然后调用repaint并绘制该单个矩形。 paintComponent每次调用时都会重绘整个面板。这意味着它将保留最后一个矩形(其余的被“重新绘制”。

您希望循环遍历所有切片并使用drawRect方法在paintComponent方法中绘制它们,以便每次都绘制它们。

public void paintComponent(Graphics g) {
  super.paintComponent(g)

      for(int k = 0; k <= 4; k++){
            for(int j = 0; j <= 3; j++){
                if(field[j][k]==null)continue;
                stein=field[j][k];
                 g.setColor(stein.farbe);
                g.fillRect((field[j][k].sX * PANELSIZE) , (field[j][k].sY * PANELSIZE) , ((((field[j][k].eX-field[j][k].sX) + 1) * PANELSIZE) -1),  ((((field[j][k].eY-field[j][k].sY)+ 1) * PANELSIZE) -1));
            }

        }
}