我有一个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();
}
答案 0 :(得分:3)
正如您所看到的,我在构造函数中调用了repaint(),但这没有任何作用
您不需要调用repaint()。 Swing将确定何时需要重新绘制。
无论如何,在这种情况下它什么都不做,因为尚未将组件添加到GUI中。
contentPane.setLayout(new FlowLayout());
您正在使用一个尊重组件大小的FlowLayout。您进行绘制的自定义组件没有首选大小,因此其大小为(0,0),因此无需绘制任何内容。
重写getPreferredSize()
方法以返回组件的大小。看起来每个网格都是(15,15),所以你应该使用:
@Override Dimension getPreferredSize()
{
return new Dimension(120, 120);
}
当然最好为您的类定义变量以包含网格大小和网格数,而不是代码中的硬编码8和15。
答案 1 :(得分:3)
你有一个布局问题。您正在使用FlowLayout并添加一个preferredSize为0,0的组件。使用BorderLayout或给Grid一个get preferred size方法:
public Dimension getPreferredSize() {
return new Dimension(somethingWidth, somethingHeight);
}
答案 2 :(得分:0)
你错过了这一行:
super.paintComponent(g);