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

Résolu
chaimamalika008@gmail.com -  
Chaima_0951 Messages postés 6 Date d'inscription   Statut Membre Dernière intervention   -
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 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
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
 
merci ça marche merci beaucoup :)
0
Chaima_0951 Messages postés 6 Date d'inscription   Statut Membre Dernière intervention  
 
Juste je veux savoir
getSize fait quoi exactement?
Et pour quoi vous l'avais ajouter a votre code?
0
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
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   Statut Membre Dernière intervention   > KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention  
 
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