我试图制作跳棋游戏,但以下架构没有在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);
}
}
我希望这样的事情
那么我的代码有什么问题?为什么paintComponent
和CaseBlanche
中CaseNoire
的行为不符合预期?
请帮忙
答案 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以了解在网格中添加组件的方法。