/ / Java JPanel paintComponent (Graphics g) non appelé - java, swing, graphics, jpanel, paintcomponent

Java JPanel paintComponent (Graphics g) non appelé - java, swing, graphics, jpanel, paintcomponent

J'ai un JPanel dont paintComponent (Graphics g)la méthode n'est pas appelée. Je sais que c’est un problème courant, mais aucune des suggestions que j’ai trouvées jusqu’à présent n’a été en mesure de le résoudre. Voici le code de 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");
}
}
}

}

Comme vous pouvez le constater, j'appelle repaint () dans le constructeur, mais cela ne fait rien. Je l'appelle aussi bon gré mal gré dans la classe JFrame qui crée un objet de cette 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();
}

Réponses:

3 pour la réponse № 1

Comme vous pouvez le constater, j’appelle repaint () dans le constructeur, mais cela ne fait rien

Vous n \ 'avez pas besoin d \' invoquer repaint (). Swing déterminera à quel moment repeindre doit être effectué.

Quoi qu’il en soit, dans ce cas, cela ne fait rien car le composant n’a pas encore été ajouté à l’interface graphique.

 contentPane.setLayout(new FlowLayout());

Vous utilisez un FlowLayout qui respecte la taille des composants. Votre composant personnalisé sur lequel vous peignez n’a pas la taille préférée, il a donc une taille (0, 0) et n’a donc rien à peindre.

Remplacer le getPreferredSize() méthode pour retourner la taille du composant. On dirait que chaque grille est (15, 15), vous devriez donc utiliser:

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

Bien sûr, il serait préférable de définir la variable pour que votre classe contienne la taille de la grille et le nombre de grilles plutôt que de coder en dur 8 et 15 dans votre code.


3 pour la réponse № 2

Vous "avez un problème d’agencement. Vous utilisez FlowLayout et vous ajoutez un composant avec une taille préférée de 0,0. Utilisez BorderLayout ou donnez à Grid une méthode de taille préférée:

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

0 pour la réponse № 3

Vous avez manqué cette ligne:

super.paintComponent(g);