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

Résolu
chaimamalika008@gmail.com -  
Chaima_0951 Messages postés 7 Statut Membre -
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);
    }
}

2 réponses

  1. KX Messages postés 19031 Statut Modérateur 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
    1. chaimamalika008@gmail.com
       
      merci ça marche merci beaucoup :)
      0
  2. Chaima_0951 Messages postés 7 Statut Membre
     
    Juste je veux savoir
    getSize fait quoi exactement?
    Et pour quoi vous l'avais ajouter a votre code?
    0
    1. KX Messages postés 19031 Statut Modérateur 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
      1. Chaima_0951 Messages postés 7 Statut Membre > KX Messages postés 19031 Statut Modérateur
         
        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