Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
(Java)绘制的矩形不显示_Java_Swing_Graphics_Awt - Fatal编程技术网

(Java)绘制的矩形不显示

(Java)绘制的矩形不显示,java,swing,graphics,awt,Java,Swing,Graphics,Awt,所以我在做一个学校项目,我想画一个由矩形组成的游戏板,这些矩形保存在一个数组中。我设法做到了,但只有最后绘制的矩形保留在面板上。我真的很绝望,我不知道我的错误在哪里 该字段为4x5字段。保存在平铺类中的坐标: 前两个代表左上角 最后两个代表它的右下角 import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.util.*; public class quoVadis{ public sta

所以我在做一个学校项目,我想画一个由矩形组成的游戏板,这些矩形保存在一个数组中。我设法做到了,但只有最后绘制的矩形保留在面板上。我真的很绝望,我不知道我的错误在哪里

该字段为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),
        };
}
intidx=0;
用于(瓷砖i:标高){

对于(int j=i.sX;j您每次都需要在
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));
            }

        }
}
当前,您正在为一个矩形调用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));
            }

        }
}
公共组件(图形g){
超级油漆组件(g)

对于(int k=0;k如何保存所有不同颜色的单个矩形并一次绘制它们?请参阅我的更新,它会给您一个更好的想法,但未经测试。是的,现在绘制所有矩形^我还有一个问题。为什么它现在能工作?我的意思是,repaint或类似的东西没有在任何地方被调用,如果我更改了某个东西的位置,我如何更新电路板?渲染JPanel(或任何组件)时默认调用paintComponent方法。现在如果你更新电路板,你可以调用repaint来重新绘制它。