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 -
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 :
la fenetre :
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:
- Repaint java
- Waptrick java football - Télécharger - Jeux vidéo
- Jeux java itel - Télécharger - Jeux vidéo
- Eclipse java - Télécharger - Langages
- Java apk - Télécharger - Langages
- Waptrick java voiture - Télécharger - Jeux vidéo
2 réponses
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
Remarque : pour que ça fonctionne il faudrait aussi ajouter un Layout à panel2, sinon pp ne s'affichera pas, par exemple avec
Toutefois je te propose une autre approche, en supprimant panel2 qui est inutile.
Quant au repaint, il me paraît plus pertinent que ce soit la méthode incrémentEtat() qui le gère :
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(); }
chaimamalika008@gmail.com
merci ça marche merci beaucoup :)