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 ...