Java 绘制添加到JComponent的JComponents时出现问题
我有一个问题,画JC组件 //类中绘制矩形的位置Java 绘制添加到JComponent的JComponents时出现问题,java,swing,paintcomponent,jcomponent,Java,Swing,Paintcomponent,Jcomponent,我有一个问题,画JC组件 //类中绘制矩形的位置 public class Board extends JComponent { private Case[][] cases= new Case[10][10]; public Plateau() { super(); this.setLayout(new GridLayout(10,10)); this.setSize(getPreferredSize());
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 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”课程,我在你的最后一个问题中说了这么多:从两周前开始。这些课程是不需要的。如果您想让用户灵活地选择正方形的颜色,该怎么办。你的游戏逻辑永远不应该基于类名或类似的东西。因此,去掉这些类,使用内置的Swing特性为组件的背景着色 我认为问题在于您在Case类中创建了变量“x,y,width,height”。我相信这些变量已经在Component类中定义,用于表示组件的大小/位置 除去这些变量,您不需要管理每个组件的大小/位置,因为GridLayout将为您完成这项工作
再一次,看看我给你的示例代码,它展示了如何创建一个“棋盘”。听我的建议,不要创建“CaseNoire”和“CaseBlanch”类,我在你的上一个问题中给出了这两个问题:从两周前开始。这些课程是不需要的。如果您想让用户灵活地选择正方形的颜色,该怎么办。你的游戏逻辑永远不应该基于类名或类似的东西。因此,去掉这些类,使用内置的Swing特性为组件的背景着色 我认为问题在于您在Case类中创建了变量“x,y,width,height”。我相信这些变量已经在Component类中定义,用于表示组件的大小/位置 除去这些变量,您不需要管理每个组件的大小/位置,因为GridLayout将为您完成这项工作
再次,看看我给你的示例代码,它显示了如何创建“棋盘”。我解决了它,我只是在
paintComponent()中设置了X=0和Y=0
我解决了这个问题,我只是在paintComponent()中设置了X=0和Y=0
要更快获得更好的帮助,请发布(最小完整可验证示例)或(简短、自包含、正确示例)。要更快获得更好的帮助,请发布(最小完整可验证示例)或(简短、自包含、正确示例).创建CaseBlanche和CaseNoire只是为了说明多态性原理,我们需要它。当您执行我的建议以去除所有实例变量时发生了什么?我按照您的建议去除了x和y,但没有解决我的问题。对于你的问题,我将做一些违背学校项目规范的事情创建CaseBlanche和CaseNoire只是为了说明我们的原则,我们需要它,当你实施我的建议去除所有实例变量时发生了什么?我按照你的建议去除了x和y但这并不能解决我的问题。对于你的问题,我将做一些违背学校项目规范的事情,你的解决方案是忽略x/y变量,这就是为什么不应该在你的课堂上定义它们。我使用它们是因为我应该根据col和行号返回案例。你不应该像我已经提到的那样创建变量x,y,width,height。这些是由组件类别定义的变量,用于由布局管理器设置组件的大小和位置。如果您想知道行/列编号处的组件,那么可以使用getLocation()方法,该方法将返回一个给出x/y值的点对象。然后,您可以使用getSize()方法返回宽度/高度值的维度对象。告诉您的老师重新定义这些变量是错误的,并且老师应该教授正确的编码技术,这样我们就不必花太多时间在论坛上纠正坏习惯。重写这些变量将使您在将来遇到问题。代码之所以有效,是因为变量与组件类的含义完全相同。因为它们确实有确切的含义,所以不需要重新定义它们。解决方法是忽略x/y变量,这就是为什么不应该在类中定义它们的原因。我使用它们是因为我应该根据col和行号返回案例。你不应该像我已经提到的那样创建变量x,y,width,height。这些是由组件类别定义的变量,用于由布局管理器设置组件的大小和位置。如果您想知道行/列编号处的组件,那么可以使用getLocation()方法,该方法将返回一个给出x/y值的点对象。然后,您可以使用getSize()方法返回宽度/高度值的维度对象。告诉您的老师重新定义这些变量是错误的,并且老师应该教授正确的编码技术,这样我们就不必花太多时间在论坛上纠正坏习惯。重写这些变量将使您在将来遇到问题。代码之所以有效,是因为变量与组件类的含义完全相同。因为它们确实有确切的含义,所以没有必要重新定义它们。
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);
}
}
protected void paintComponent(Graphics g)
{
g.setColor(Color.darkGray);
g.fillRect(0, 0,width,height);
}