添加到 JComponent 的绘制 JComponents 中的问题

Issue in Painting JComponents added to JComponent

我有一个 Issue painting jcomponent

//class 应该绘制矩形的位置

public class Board extends JComponent
{
    private Case[][] cases= new Case[10][10];  

    public Plateau() {
        super();
        this.setLayout(new GridLayout(10,10));
        this.setSize(getPreferredSize());

        for (int i = 0; i < 10; i++) {
            for (int j = 0; j < 10; j++) {
                if ((i + j) % 2 == 0) {

                  cases[i][j] = new WhiteCase(j * Case.LONGUEUR, i * Case.LONGUEUR, Case.LONGUEUR, Case.LONGUEUR);
                } else {
                    cases[i][j] = new BlackCase(j * Case.LONGUEUR, i * Case.LONGUEUR, Case.LONGUEUR, Case.LONGUEUR);

                }                          
                add(cases[i][j]);
            }
        }
        repaint(); 

    }   
    public Dimension getPreferredSize() {
          return new Dimension(600, 600);
        }
}

//class 矩形底

public abstract class   Case extends JComponent  {


    protected static final int LONGUEUR=60;

    protected  int x,y,width,height;                
    protected abstract void paintComponent(Graphics g);
    public Dimension getPreferredSize() {             return new Dimension(LONGUEUR, LONGUEUR);
        }
}

///黑色外壳

public class BlackCase extends Case
{

    private Piece piece; 
    private static final long serialVersionUID = 1L;
    public CaseNoire(int x, int y,int width,int height)
    {

        this.x=x;
        this.y=y;  
        this.width = width;   
        this.height= height;
    }
    public Dimension getPreferredSize() {
          return new Dimension(LONGUEUR, LONGUEUR);
        }
@Override
protected void paintComponent(Graphics g)
{   

    g.setColor(Color.darkGray);      
    g.fillRect(x, y,width,height);                  
}
}


public class CaseWhite extends Case {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    public CaseBlanche(int x, int y,int width,int height)
    {

        this.x=x;
        this.y=y;  
        this.width = width;   
        this.height= height;


    }

    @Override
    public void paintComponent(Graphics g)
    {

        g.setColor(Color.white);      
        g.fillRect(x, y,width,height);
        g.setColor(Color.BLACK);
        g.drawString("X= "+x , 10, 10);
    }
    public Dimension getPreferredSize() {
          return new Dimension(LONGUEUR, LONGUEUR);
        }

}

//Main  class
public class CheckersGame extends JFrame {

    private static final long serialVersionUID = 1L;

    public static void main(String[] args )
    {
     CheckersGame  checkers= new CheckersGame();  
    } 
    public  CheckersGame()    
    {

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setTitle("Jeu de Dames");                     
        JPanel panelPrincipalDame = new JPanel(new GridBagLayout());  

        Board board = new Board();
        GridBagConstraints c  =  new GridBagConstraints(); 
        c.fill= GridBagConstraints.NONE;  
        c.gridx =0; 
        c.gridy = 0 ; 
        c.gridheight= 2; 
        c.gridwidth= 2;  

        panelPrincipalDame.add(plateau,c);  
  setSize(800, 700);
        setContentPane(panelPrincipalDame);     

        ![//setVisible(true);][1]
        setResizable(false);        
    }    
}

此代码的结果是(注意 X+ 0 等。仅用于调试目的)

但我想要的是这个

请问为什么我只得到一个矩形?

非常感谢听取我关于不创建 "CaseNoire" 和 "CaseBlanch" classes 的建议,我在两周前提出了你的最后一个问题:。这些 class 是不需要的。如果您想让用户灵活地选择方块的颜色,会发生什么情况。您的游戏逻辑永远不应基于 class 名称或类似名称。因此,摆脱 classes 并使用内置的 Swing 功能为组件的背景着色。

我认为问题是因为您在案例 class 中创建了变量 "x, y, width, height"。我相信这些变量已经在组件 class 中定义,以表示组件的 size/location。

摆脱变量,您不需要管理每个组件的 size/location,因为 GridLayout 会为您做这些。

再一次,看看我给你的示例代码,它展示了如何创建一个 "ChessBoard"。

我解决了 我只是在 paintComponent()

中设置了 X=0 和 Y= 0
protected void paintComponent(Graphics g)
{   

    g.setColor(Color.darkGray);      
    g.fillRect(0, 0,width,height);            
}