绘制JComponents的问题已添加到JComponent

时间:2015-04-19 22:38:26

标签: java swing paintcomponent jcomponent

我有一个问题绘画jcomponent

//矩形应绘制的类

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

//类矩形

的基础
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等..仅用于调试目的) enter image description here

但我想要的是这个 enter image description here

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

2 个答案:

答案 0 :(得分:4)

听了我的建议,不要创建我在上一个问题中提出的“CaseNoire”和“CaseBlanch”课程:paintComponent does not paint correctly来自两周前。不需要这些类。如果您想让用户灵活选择方块的颜色会发生什么。你的游戏逻辑永远不应该基于类名或类似的东西。因此,除去类并使用内置的Swing功能为组件的背景着色。

我认为问题是因为你在Case类中创建了变量“x,y,width,height”。我相信这些变量已在Component类中定义,以表示组件的大小/位置。

摆脱变量,你不需要管理每个组件的大小/位置,因为GridLayout会为你做这个。

再次,看看我给你的示例代码,它显示了如何创建“ChessBoard”。

答案 1 :(得分:0)

我解决了它我只是在paintComponent()

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

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