/ / Java JPanel paintComponent (Gráficos g) não chamado - java, swing, graphics, jpanel, paintcomponent

Java JPanel paintComponent (Graphics g) não chamado - java, swing, gráficos, jpanel, paintcomponent

Eu tenho um JPanel cujo paintComponent (Graphics g)método não está sendo chamado. Eu sei que este é um problema comum, mas nenhuma das sugestões que eu encontrei até agora foi capaz de consertá-lo. Aqui está o código para o 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");
}
}
}

}

Como você pode ver, eu chamo repaint () no construtor, mas isso não faz nada. Eu também o chamo por vontade própria na classe JFrame que cria um objeto dessa classe:

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

Respostas:

3 para resposta № 1

Como você pode ver, eu chamo repaint () no construtor, mas isso não faz nada

Você não precisa invocar repaint (). Swing determinará quando a repintura precisa ser feita.

De qualquer forma, neste caso, não faz nada porque o componente não foi adicionado à GUI ainda.

 contentPane.setLayout(new FlowLayout());

Você está usando um FlowLayout que respeita um tamanho de componentes. Seu componente personalizado onde você faz a pintura não tem um tamanho preferido, então seu tamanho é (0, 0), então não há nada para pintar.

Substituir o getPreferredSize() método para retornar o tamanho do componente. Parece que cada grade é (15, 15), então você deve usar:

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

É claro que seria melhor definir uma variável para sua classe para conter o tamanho da grade e o número de grades em vez de codificar os códigos 8 e 15 no código.


3 para resposta № 2

Você tem um problema de layout. Você está usando o FlowLayout e adicionando um componente com um preferredSize de 0,0. Use o BorderLayout ou dê ao Grid um método de tamanho preferido:

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

0 para resposta № 3

Você perdeu esta linha:

super.paintComponent(g);