La méthode repaint en java (ça marche pas ? )

Résolu/Fermé
chaimamalika008@gmail.com - Modifié le 29 avril 2020 à 11:00
Chaima_0951 Messages postés 6 Date d'inscription mercredi 29 avril 2020 Statut Membre Dernière intervention 6 mai 2020 - 29 avril 2020 à 21:43
Bonjour,
Est ce que quelqu'un peut me dire pourquoi la méthode repaint() de awt.Component ca marche pas ,Quand je l'appelle il ne se passe rien.Plus concrètement, j'ai un graphique dans une fenêtre, a chèque foit doit incrémente état d'un potonce est redessine potence mais la méthode repaint ça marche pas voici mon code .

la classe potonce :
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;

public class Potence extends Component {
    public int état;
    public boolean trouve;
    Dimension di;

    public int incrémentEtat() {
        return (état = getÉtat() + 1);
    }

    // Dessin de la potence  //
    public void paint(Graphics g) {
        // Le dessin s'adapte à l'espace attribué
        this.di = getSize();
        // de Component
        g.clearRect(0, 0, di.width - 1, di.height - 1);
        // effacer
        g.drawRect(0, 0, di.width - 1, di.height - 1);
        // tracer le cadre
        // s'adapter à l'espace du composant
        int taille = 12 * (di.width / 120);
        if (taille < 8)
            taille = 8;
        g.setFont(new Font("TimesRoman", Font.PLAIN, taille));
        if (getÉtat() >= 1)
            g.drawLine(l(30), h(120), l(90), h(120));
        if (getÉtat() >= 2)
            g.drawLine(l(30), h(120), l(30), h(40));
        if (getÉtat() >= 3)
            g.drawLine(l(60), h(120), l(30), h(90));
        if (getÉtat() >= 4)
            g.drawLine(l(30), h(40), l(80), h(40));
        if (getÉtat() >= 5)
            g.drawLine(l(30), h(60), l(50), h(40));
        if (getÉtat() >= 6)
            g.drawLine(l(70), h(40), l(70), h(60));
        if (getÉtat() >= 7)
            g.drawOval(l(65), h(60), l(10), h(10));// tête
        if (getÉtat() >= 8) {
            g.drawLine(l(70), h(70), l(70), h(85));// corps
            g.drawLine(l(70), h(70), l(65), h(75));// corps
            g.drawLine(l(70), h(70), l(75), h(75)); // corps
            g.drawLine(l(70), h(85), l(65), h(95)); // corps
            g.drawLine(l(70), h(85), l(75), h(95)); // corps
            setVisible(true);
        }
        if (trouve)
            g.drawString("Bravo! vous avez trouvé", l(10), h(150));
        else if (getÉtat() == 8)
            g.drawString("Vous êtes pendu !", l(10), h(150));
        else if (getÉtat() == 7)
            g.drawString("Reste un coup à jouer !", l(10), h(150));
        else // (etat >=0 && etat <7)
            g.drawString("Reste " + (8 - getÉtat()) + "coups à jouer", l(10), h(150));
        setVisible(true);
    }

    //Mise à l'échelle en largeur de v
    int l(int v) {
        double k = Math.min(di.width / 140., di.height / 160);
        return (int) (v * k);
    } // Mise à l'échelle en hauteur de v

    int h(int v) {
        double k = Math.min(di.width / 140., di.height / 160);
        return (int) (v * k);
    }

    public int getÉtat() {
        return état;
    }
}

la fenetre :
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class fenetrepotonce extends JFrame implements ActionListener {
    JPanel panel1, panel2;
    JButton bt1;
    Potence pp;

    public fenetrepotonce() {
        this.setSize(600, 500);
        setResizable(false);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLayout(new BorderLayout());
        bt1 = new JButton("incrémentEtat");
        panel1 = new JPanel();
        panel2 = new JPanel();
        pp = new Potence();
        this.setSize(600, 500);
        panel1.add(bt1);
        bt1.addActionListener(this);
        add(panel1, BorderLayout.NORTH);
        add(panel2, BorderLayout.CENTER);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getActionCommand().equals("incrémentEtat")) {
            pp.trouve = false;
            this.pp.incrémentEtat();
            if (pp.état <= 8) {
                pp.repaint();
                panel2.add(pp);
            }
        }
    }

    public static void main(String[] argv) {
        fenetrepotonce f = new fenetrepotonce();
        f.setVisible(true);
    }
}
A voir également:

2 réponses

KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
29 avril 2020 à 11:25
Bonjour,

Le problème ici ce n'est pas le repaint de pp, mais c'est que tu n'as pas revalidate panel2, c'est à dire que Swing ne sait pas que tu as ajouté pp dans le panel2, c'est pour ça qu'il ne le dessine pas.
On pourrait modifier
pp.repaint(); panel2.add(pp);
par
panel2.add(pp); panel2.revalidate();
car c'est le panel2 qu'il faut rafraîchir maintenant qu'il a un nouveau contenu (ce qui appellera notamment la méthode paint de pp).

Remarque : pour que ça fonctionne il faudrait aussi ajouter un Layout à panel2, sinon pp ne s'affichera pas, par exemple avec
panel2 = new JPanel(new BorderLayout());


Toutefois je te propose une autre approche, en supprimant panel2 qui est inutile.
public class fenetrepotonce extends JFrame {

    public fenetrepotonce() {
        setSize(600, 500);
        setResizable(false);
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        Potence pp = new Potence();
        add(pp, BorderLayout.CENTER);

        JButton bt1 = new JButton("incrémentEtat");
        bt1.addActionListener(evt -> {
            pp.trouve = false;
            pp.incrémentEtat();
        });

        JPanel panel1 = new JPanel();
        panel1.add(bt1);
        add(panel1, BorderLayout.NORTH);
    }

Quant au repaint, il me paraît plus pertinent que ce soit la méthode incrémentEtat() qui le gère :
public void incrémentEtat() {
    état++;
    repaint();
}
0
chaimamalika008@gmail.com
29 avril 2020 à 14:21
merci ça marche merci beaucoup :)
0
Chaima_0951 Messages postés 6 Date d'inscription mercredi 29 avril 2020 Statut Membre Dernière intervention 6 mai 2020
29 avril 2020 à 18:58
Juste je veux savoir
getSize fait quoi exactement?
Et pour quoi vous l'avais ajouter a votre code?
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
29 avril 2020 à 21:18
getSize() permet de récupérer la taille - réellement affichée - du composant, cela permet de dessiner sur tout l'espace disponible.
0
Chaima_0951 Messages postés 6 Date d'inscription mercredi 29 avril 2020 Statut Membre Dernière intervention 6 mai 2020 > KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024
29 avril 2020 à 21:43
Alors la potense va etre affichée dans tout la fenetre ,jai essayé d'enlever cette ligne de code et ajouter un constructeur a la classe potense que jedonne la dimention que je veux
0