2013-12-08 59 views
0

我想创建一个在java中使用fillrect函数的国际象棋棋盘。代码似乎没有工作,并且只添加了框架中的第一条语句。即使我删除了for循环(可打印64个方格),并只有2添加语句,它仍然只打印第一them.Here的是代码:在Java中建立国际象棋板

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

“只添加框架中的第一条语句”是什么意思?为什么不能为单元格的JPanel调用setBackground()? – StanislavL

+0

如果我删除循环,并作出2添加语句(黑色和白色Rect consistion)它只增加了框架的第一条语句。我正在读一本书学习Java和它的一个练习,要求填写。而我想解决这个特殊的问题。 – Lind

+0

与您的问题没有关系,但为什么'DrawRect'不能直接保存'Color'?如果你绝对需要这种方式,为什么一个字符串,而不是一个枚举或int? – JensG

回答

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

感谢您的info.I有一个逻辑错误,在分配颜色的循环,我没有正确使用fillrect.Thanks – Lind

2

你的问题与getX()getY(),他们返回相同的数值为每你的DrawRect,所以他们将被绘制一个在另一个之上。你可以使用setBackground代替:

class DrawRect extends JPanel { 
    private Color ngjyra = Color.BLACK; 

    public DrawRect(Color color) { 
     ngjyra = color ; 
     setBackground(ngjyra); 
} 

但是你仍然有一个错误在你的循环逻辑,你会看到,如果你试试我上面贴的代码。

+0

我不认为你的想法是正确的。当我添加两个statemens像add(新DrawRect(“WHITE”));添加(新的DrawRect(“BLACK”));它不会添加黑色方块,而是添加一个白色方块。这消除了将它们绘制成一个在另一个之上的想法。如果使用JPanel,则会使用setBackground ...我正在绘制矩形。 – Lind

+0

您的DrawRect类正在扩展一个JPanel。你可以使用setBackground来获得相同的效果,而不用担心绘制方法。 – PakkuDon

+0

正如我所说我想绘制矩形。这是练习所要求的。我必须使用绘画方法。 – Lind