2
votes

Comment retarder le code Java jusqu'à ce qu'une autre partie du code soit terminée?

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 commentaires

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


3 Réponses :


1
votes

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 .


0 commentaires

-1
votes

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:

Instanciation

public void paintComponent(Graphics g) 
{
    super.paintComponent(g);
    this.g = g;
    this.callback(g)

Fonction CTOR ou Init

public Gui(GraphicsCallback callback) 

Invoke

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


0 commentaires

2
votes

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>


0 commentaires