繁体   English   中英

Java JPanel paintComponent(Graphics g)未调用

[英]Java JPanel paintComponent(Graphics g) not called

我有一个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");
            }
        }
    }

}

如您所见,我在构造函数中调用了repaint(),但没有执行任何操作。 我还在创建此类的对象的JFrame类中称其为Willy nilly:

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

public class Game
{
    private Grid grid;
    private JFrame frame;
public Game(){
this.makeFrame();
}

private void makeFrame(){
    grid = new Grid();
    frame = new JFrame ("Frame");
    Container contentPane = frame.getContentPane();
    contentPane.setLayout(new FlowLayout());
    //grid.paint(grid.getGraphics());
    grid.repaint();
    frame.add(grid);
    grid.repaint();
    frame.pack();
    grid.repaint();
    frame.setVisible(true);
    grid.repaint();
}

如您所见,我在构造函数中调用了repaint(),但没有执行任何操作

您不需要调用repaint()。 摆动将确定何时需要重新粉刷。

无论如何,在这种情况下它什么都不做,因为该组件尚未添加到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或使Grid获得首选的尺寸方法:

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

您错过了这一行:

super.paintComponent(g);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM