(Java)绘制的矩形不显示
所以我在做一个学校项目,我想画一个由矩形组成的游戏板,这些矩形保存在一个数组中。我设法做到了,但只有最后绘制的矩形保留在面板上。我真的很绝望,我不知道我的错误在哪里 该字段为4x5字段。保存在平铺类中的坐标: 前两个代表左上角 最后两个代表它的右下角(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
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来重新绘制它。