gpt4 book ai didi

java - PaintComponent 无法正确绘制

转载 作者:行者123 更新时间:2023-12-02 04:48:27 25 4
gpt4 key购买 nike

我正在尝试制作西洋跳棋游戏,但以下架构没有在 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);


}

}
}
}
}

这里是主类
导入 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

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

最佳答案

public void paintComponents(Graphics g)

你有一个错字。去掉paintComponents()中的“s”

setSize(800, 600);

这不会按您的预期工作,因为 (880, 600) 包括标题栏和边框,因此某些方 block 将无法正确绘制。

因此,您的自定义绘画类应该重写 getPreferredSize() 方法以返回每个组件的大小。然后您可以使用 pack() 方法来确保组件的大小正确。

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

setBackground(Color.BLACK);

然后当你绘制你刚刚使用的组件时:

g.setColor( getBackground() );

此外,您的 Plateau 类是错误的。 PaintComponent() 方法用于绘画。您的代码正在创建和添加组件组件。如果您想添加组件,那么您应该使用布局管理器。只要实现了 getPreferredSize() 方法,GridLayout 就可以轻松地在网格中添加组件。您创建具有指定宽度/高度的组件,因此要实现此方法,您需要执行以下操作:

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

看看这个 Chessboard Example了解在网格中添加组件的方法。

关于java - PaintComponent 无法正确绘制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29473686/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com