【问题标题】:Building a chess board in Java用Java构建棋盘
【发布时间】:2013-12-08 10:02:38
【问题描述】:

我正在尝试使用 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

}
}

【问题讨论】:

  • “只添加框架中的第一个语句”是什么意思?为什么不能只为单元格的 JPanel 调用 setBackground()?
  • 如果我删除循环,并制作 2 个 add 语句(由一个黑白 Rect 组成),它只会将第一个语句添加到框架中。我正在读一本书来学习 java 及其练习要求填充矩形。我想解决这个特殊问题。
  • 与您的问题无关,但为什么DrawRect不能直接持有Color?如果你绝对需要这种方式,为什么是字符串,而不是枚举或整数?
  • 一个好主意。感谢您提供关于那个的信息。一个 int 会简单得多。
  • @Lind an enum 会简单得多。

标签: java swing jpanel paintcomponent rectangles


【解决方案1】:

你的图形使用了组件左上角为零的相对坐标,所以绘制矩形的正确方法是

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"));
        }

【讨论】:

  • 感谢您的信息。我在分配颜色的循环中有一个逻辑错误,我没有正确使用 fillrect。谢谢
【解决方案2】:

您的问题在于getX()getY(),它们为您的每个DrawRect 返回相同的值,因此它们将被绘制在另一个之上。您可以改用setBackground

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

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

但是,您的循环逻辑仍然存在错误,如果您尝试我上面发布的代码,您将看到。

【讨论】:

  • 我不认为你的想法是正确的。当我添加两个像 add(new DrawRect("WHITE"));添加(新绘制矩形(“黑色”));它没有添加黑色方块,而是添加了一个白色方块。这消除了将它们绘制在另一个之上的想法。如果我使用 JPanels 将使用 setBackground ...我正在绘制矩形。
  • 您的 DrawRect 类正在扩展 JPanel。您可以在其上使用 setBackground 来获得相同的效果,而无需担心paint方法。
  • 我说过我要画矩形。这是练习要求的。我必须使用paint方法。
  • 你的假设是错误的。事实上,两个DrawRects 都被添加了,但绘制在彼此之上。它只是看起来只画了一个。
  • 你的类是一个JPanel,所以你可以使用setBackground
猜你喜欢
  • 1970-01-01
  • 2017-11-04
  • 2021-04-12
  • 2019-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多