paintComponent没有正确绘制

时间:2015-04-06 14:54:59

标签: java swing

我试图制作跳棋游戏,但以下架构没有在JFrame上显示我做错了什么

//基类

import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.*;

public abstract class   Case extends JComponent implements MouseListener {

     /**
     * 
     */
    private static final long serialVersionUID = 1L;
    protected static final int LONGUEUR=40; 
    protected  int x,y,width,height;   


    @Override
    public void mouseClicked(MouseEvent arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mouseEntered(MouseEvent arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mouseExited(MouseEvent arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mousePressed(MouseEvent arg0) {
        // TODO Auto-generated method stub

    }
    @Override
    public void mouseReleased(MouseEvent e) {
        // TODO Auto-generated method stub

    }
}

//黑色矩形

import java.awt.Color;
import java.awt.Graphics;


public class CaseNoire extends Case
{
/**
     * 
     */
    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;
    }

@Override
protected void paintComponent(Graphics g)
{   
    g.setColor(Color.black);      
    g.fillRect(x, y,width,height);  
}
}

//白色矩形

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;


public class CaseBlanche 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)
    {
        super.paintComponent(g);
        g.setColor(Color.white);      
        g.fillRect(x, y,width,height);   
    }

}

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Paint;

import javax.swing.JComponent;
import javax.swing.JPanel;

public class Plateau extends JComponent
{
    private Case[][] cases= new Case[10][10];  
    @Override
    protected void paintComponent(Graphics g) {
        // TODO Auto-generated method stub
        super.paintComponent(g);                
           for(int i=0; i<10;  i++)
           {
               for(int j=0;j<10;j++)
               {
                   if((i+j)%2==0)
                   {
                       CaseBlanche blanche= new CaseBlanche(j*Case.LONGUEUR,i*Case.LONGUEUR,Case.LONGUEUR, Case.LONGUEUR);
                       //cases[i][j]=blanche;
                       add(blanche); 
                       //g.setColor(Color.white);      
                       // g.fillRect(j*40, i*40,40,40); 
                   }
                   else
                   {
                       CaseNoire caseNoire=new CaseNoire(j*Case.LONGUEUR,i*Case.LONGUEUR,Case.LONGUEUR, Case.LONGUEUR);
                   add(caseNoire);


                   }                   

               }
           }                        
    }
}

,这里是主类
    import javax.swing.JFrame;

public class MainDamesFrame extends JFrame {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    public static void main(String[] args )
    {
        MainDamesFrame damesFrame = new MainDamesFrame(); 


    } 
    public  MainDamesFrame()    
    {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setTitle("Jeu de Dames");                           
        this.getContentPane().add(new Plateau());       
        setSize(800, 600);
        setVisible(true);                   

    }

}

我希望这样的事情

enter image description here

那么我的代码有什么问题?为什么paintComponentCaseBlancheCaseNoire的行为不符合预期?
请帮忙

1 个答案:

答案 0 :(得分:2)

public void paintComponents(Graphics g)

你有一个错字。摆脱paintComponents()中的"s"

setSize(800, 600);

这不会像你期望的那样工作,因为(880,600)包括标题栏和边框,因此一些正方形将无法正确绘制。

因此,您的自定义绘制类应覆盖getPreferredSize()方法以返回每个组件的大小。然后,您可以使用pack()方法确保组件的大小合适。

不需要CaseNoir和CaseBlanche类。创建Case对象时,您可以使用:

setBackground(Color.BLACK);

然后当您绘制组件时,只需使用:

g.setColor( getBackground() );

另外,你的高原课程是错误的。 paintComponent()方法用于绘制。您的代码正在创建和添加组件组件。如果要添加组件,则应使用布局管理器。只要实现了getPreferredSize()方法,GridLayout就可以轻松地在网格中添加组件。您可以使用指定的宽度/高度创建组件,因此要实现此方法,请执行以下操作:

@Override
public Dimension getPreferredSize()
{
    return new Dimension(width, height)
}

查看此Chessboard Example以了解在网格中添加组件的方法。