J'ai donc essayé la bibliothèque java.awt.Graphics et j'ai rencontré un problème dans mon code. Le code ci-dessous renvoie une exception de pointeur nul car l'objet graphique "g" n'est pas défini au moment de l'exécution. Je pourrais boucler l'appel et vérifier si g! = Null mais y a-t-il une meilleure façon de le faire?
Merci pour toute aide.
Voici mon code:
package gui;
public class Main {
public static void main(String[] args)
{
new Gui().draw(new Tuple(200,200)); //Tuple is a custom class I wrote
}
}
et la classe principale:
package gui;
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JPanel;
@SuppressWarnings("serial")
public class Gui extends JPanel{
Graphics g;
public Gui()
{
JFrame frame = new JFrame("test");
frame.setSize(700, 700);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
frame.add(this);
}
public void paintComponent(Graphics g)
{
super.paintComponent(g);
this.g = g;
g.setColor(Color.blue);
for(int x = 0;x < 700; x += 20)
{
g.drawLine(x, 0, x, 700);
}
for(int y = 0;y < 700; y += 20)
{
g.drawLine(0, y, 700, y);
}
}
public void draw(Tuple xy)
{
g.setColor(Color.blue); // <--- null pointer exception
g.fillOval(xy.x, xy.y, 5, 5);
}
}
3 Réponses :
vous devez faire tout le dessin avec la méthode
public void paintComponent(Graphics g)
comme indiqué sur https://docs.oracle.com/javase/tutorial/uiswing/painting/problems.html .
Utilisez une fonction de rappel. Bien mieux que interroger la propriété. Et vous obtenez un nouvel objet graphique. Et votre appel est exécuté dans le bon contexte.
Voici l'idée générale:
public void paintComponent(Graphics g)
{
super.paintComponent(g);
this.g = g;
this.callback(g)
public Gui(GraphicsCallback callback)
Appelle le rappel. Vous pouvez vérifier s'il est appelé et ne rappeler qu'une seule fois si cela convient à votre cas d'utilisation. Ou la mise en œuvre du rappel peut gérer plusieurs appels.
new Gui((Graphics graphics)-> {
// your code here
});
J'ai trouvé une solution à mon problème nul. J'ai modifié la méthode "draw ()" pour accepter un tuple puis le passer dans la fonction paintComponent () et appeler repaint ().
package gui;
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JPanel;
@SuppressWarnings("serial")
public class Gui extends JPanel{
Graphics g;
Tuple xy;
public Gui()
{
JFrame frame = new JFrame("test");
frame.setSize(700, 700);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
frame.setLocationRelativeTo(null);
frame.add(this);
}
public void paintComponent(Graphics g)
{
super.paintComponent(g);
this.g = g;
g.setColor(Color.blue);
for(int x = 0;x < 700; x += 20)
{
g.drawLine(x, 0, x, 700);
}
for(int y = 0;y < 700; y += 20)
{
g.drawLine(0, y, 700, y);
}
if(xy != null)
{
g.fillOval(xy.x, xy.y, 5, 5);
}
}
public void draw(Tuple xy)
{
this.xy = xy;
repaint();
}
}
Merci pour votre aide
p>
Ne conservez pas de référence à Graphics, utilisez plutôt un setter pour définir la valeur Tuple (et appelez repaint), puis depuis paintComponent, peignez le Tuple s'il n'est pas nul
Et comment faire exécuter à nouveau la méthode paintComponent pour vérifier si le Tuple a été mis à jour?
Appeler repeindre ...