Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 绘制添加到JComponent的JComponents时出现问题_Java_Swing_Paintcomponent_Jcomponent - Fatal编程技术网

Java 绘制添加到JComponent的JComponents时出现问题

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

我有一个问题,画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());

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