我正在尝试使用java中的fillrect函数创建一个棋盘。代码似乎没有工作,只添加了框架中的第一个语句。即使我删除for循环(打印64个方块)并且只生成2个add语句,它仍然只打印第一个。这里是代码:
import javax.swing.* ;
import java.awt.* ;
public class ChessBoard extends JFrame {
private int i;
public ChessBoard (){
setLayout(new GridLayout(8,8,0,0));
// there are 64 squares
for(i=0; i<64 ;i++){
if ((i % 2) == 0) //switches between black and white squares
add(new DrawRect("WHITE"));
else
add(new DrawRect("BLACK"));
}
}
}
class DrawRect extends JPanel{
private String ngjyra = "BLACK";
public DrawRect(String b) {
ngjyra = b ;
}
@Override
protected void paintComponent (Graphics g){
super.paintComponent(g);
if (ngjyra.equals("BLACK"))
g.setColor(Color.BLACK);
else
g.setColor(Color.WHITE);
g.fillRect(getX(), getY(), getWidth(), getHeight());
//add the square with the specified color
}
}
答案 0 :(得分:3)
您的图形在组件的左上角使用零相对坐标,因此绘制矩形的正确方法是
g.fillRect(0, 0, getWidth(), getHeight());
您的颜色分配代码的另一个问题是所有黑色和所有单元格都会产生垂直条纹。使用像
这样的逻辑 for (int row = 0; row < 8; row++)
for (int col = 0; col < 8; col++) {
boolean white = (col % 2 == 0) == (row % 2 == 0);
add(new DrawRect(white ? "WHITE" : "BLACK"));
}
答案 1 :(得分:2)
您的问题出在getX()
和getY()
上,它们会为您的每个DrawRect
返回相同的值,因此它们会一个在另一个之上。您可以改为使用setBackground
:
class DrawRect extends JPanel {
private Color ngjyra = Color.BLACK;
public DrawRect(Color color) {
ngjyra = color ;
setBackground(ngjyra);
}
但是你的循环逻辑仍然存在错误,因为你会看到你尝试我上面发布的代码。