Java JPanel paintComponent(图形g)未调用

Java JPanel paintComponent(图形g)未调用,java,swing,graphics,jpanel,paintcomponent,Java,Swing,Graphics,Jpanel,Paintcomponent,我有一个JPanel,它的paintComponent(Graphics g)方法没有被调用。我知道这是一个常见的问题,但到目前为止,我发现的任何建议都无法解决它。以下是JPanel的代码: import javax.swing.*; import java.awt.*; public class Grid extends JPanel { Candy[][] gridRep = new Candy[8][8]; public Grid() { th

我有一个JPanel,它的paintComponent(Graphics g)方法没有被调用。我知道这是一个常见的问题,但到目前为止,我发现的任何建议都无法解决它。以下是JPanel的代码:

import javax.swing.*;
import java.awt.*;

public class Grid extends JPanel

{
    Candy[][] gridRep = new Candy[8][8];
    public Grid()

    {
        this.setLayout(new GridLayout(8,8));
        this.populateRandom();
        this.repaint();
    }

    ...

    public void paintComponent(Graphics g){
        Graphics2D g2 = (Graphics2D)g;
        for (int r = 0; r<8; r++){
            for (int c = 0; c<8; c++){
                g2.setColor(gridRep[r][c].getColor());
                g2.drawOval(getXCoordinate(gridRep[r][c])*15, getYCoordinate(gridRep[r][c])*15, 10, 10);
                System.out.println("repainting");
            }
        }
    }

}

您错过了这一行:

super.paintComponent(g);
正如您所看到的,我在构造函数中调用了repaint(),但这没有任何作用

您不需要调用repaint()。Swing将确定何时需要重新喷漆

无论如何,在这种情况下,它什么也不做,因为组件还没有添加到GUI中

 contentPane.setLayout(new FlowLayout());
您使用的是符合组件大小的FlowLayout。进行绘制的自定义组件没有首选大小,因此其大小为(0,0),因此无需绘制任何内容

重写
getPreferredSize()
方法以返回组件的大小。看起来每个网格都是(15,15),因此您应该使用:

@Override Dimension getPreferredSize()
{
    return new Dimension(120, 120);
}

当然,最好为类定义变量以包含网格大小和网格数,而不是在代码中硬编码8和15。

您遇到了布局问题。您正在使用FlowLayout并添加preferredSize为0,0的组件。使用BorderLayout或为网格提供“获取首选大小”方法:

public Dimension getPreferredSize() {
   return new Dimension(somethingWidth, somethingHeight);
}

这是一个很好的建议,会引起问题,但不是问题的根本原因……Swing中的绘制是一个复杂的方法类链,您必须调用
super.paintXxx
,否则您将遇到随机且难以重复的绘制问题。请查看以了解更多详细信息
public Dimension getPreferredSize() {
   return new Dimension(somethingWidth, somethingHeight);
}