Afficher Polygon en un clic avc passage d'argument [Résolu] - Java

Afficher Polygon en un clic avc passage d'argument JS - texte affiché lors d'un clic sur un lien (Résolu) » Forum - Javascript [php] Afficher texte en un clic (Résolu) » Forum - PHP TextField qui affiche le calendrier sur clic (Résolu) » Forum - Programmation Une news s'affiche en dessous au clic » Forum - Webmaster Afficher un message au clic de la souris » Forum - Webmaster

Salut tout le monde j'ai un blem , en fait je veux de telle sorte que si je clique sur le bouton afficher , sa affiche un polygone avec les arguments passer voici mon code qui ne marche pas .Aider moi SVP:

la classe qui affiche le resultat :

import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent;  import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.SwingUtilities;  public class Final extends JFrame{    public static void main(String[] args) {            SwingUtilities.invokeLater(new Runnable() {                                public void run() {     JFrame fenetre = new JFrame();   JPanel panel = new JPanel();   JButton bouton = new JButton("afficher");   Dessin ds = new Dessin();      fenetre.add(panel);   panel.add(bouton);   panel.add(ds);      fenetre.setVisible(true);   fenetre.setSize(200, 300);      bouton.addMouseListener(new MouseAdapter() {       public void mouseClicked(MouseEvent arg0) {        ds.polygon(200,30,50,60,60,50,30,20,30,20,20,30,50,60,60,500);    }   });  }             });  } }


classe dont contient le polygone :


import java.awt.Component; import java.awt.Graphics;  public class Polygone extends Component {    int a,b,c,d,e,f,g,h;  int a1,b2,c3,d4,e5,f6,g7,h8;    int x[]= {a,b,c,d,e,f,g,h} ;  int y[]= {a1,b2,c3,d4,e5,f6,g7,h8};    public void paintComponent(Graphics g){      g.drawPolygon(x,y,8);     }    public void polygon(int a,int b,int c,int d,int e,int f,int g, int h,int a1,int b2,int c3,int d4,int e5,int f6,int g7,int h8) {      this.a= a;   this.b= b;   this.c= c;   this.d= d;   this.e= e;   this.f= f;   this.g= g;   this.h= h;      this.a1= a1;   this.b2= b2;   this.c3= c3;   this.d4= d4;   this.e5= e5;   this.f6= f6;   this.g7= g7;   this.h8= h8;           repaint();  } }

Forum

Afficher Polygon en un clic avc passage d'argument JS - texte affiché lors d'un clic sur un lien (Résolu) » Forum - Javascript [php] Afficher texte en un clic (Résolu) » Forum - PHP TextField qui affiche le calendrier sur clic (Résolu) » Forum - Programmation Une news s'affiche en dessous au clic » Forum - Webmaster Afficher un message au clic de la souris » Forum - Webmaster

Web: www.shapebootstrap.net

9 réponses

Marsh

NOVEMBER 9, 2013 AT 9:15 PM

Bonjour,

Problème 1
Quand tu fais
ds.polygon(200,30,50,60,...);
ds correspond à l'objet
Dessin ds = new Dessin();
or la méthode
polygon(int a,int b,int c,int d,...)
tu l'as déclaré dans la classe Polygone (qui n'est donc pas un Dessin).
Tu as donc une erreur à la compilation qui te dis que la méthode polygon n'existe pas dans la classe Dessin.
Il faudrait donc que tu déclares un
Polygon ds = new Polygon();
pour pouvoir utiliser le reste de ton code.

Problème 2
La méthode paintComponent (Swing) n'existe pas dans la classe Component (AWT), donc tu penses faire de la surcharge de la méthode, alors que pas du tout. Il faudrait plutôt surcharger la méthode paint (AWT).

Problème 3
Tu fais un
g.drawPolygon(x,y,8);
avec
x[]= {a,b,c,d,e,f,g,h};
et
y[]= {a1,b2,c3,d4,e5,f6,g7,h8};
qui ont été initialisés à la construction de l'objet, c'est à dire quand a,b,c,d... valent 0, donc x et y ne contiennent que des 0.
Quand dans ta méthode polygon, tu viens modifier les valeurs a,b,c,d... ça ne modifie pas les valeurs de x et y, ils sont toujours remplis que de 0, il vaudrait mieux passer en paramètres les tableaux x et y.

Problème 4
Quand tu créés un Panel, par défaut il utilises un FlowLayout, dans ton cas ce n'est pas pertinent, cela va bien afficher le bouton, mais pas le Component de dessin. Tu pourrais par exemple considérer le BorderLayout de la JFrame, sans utiliser de Panel intermédiaire.

Remarque 1
Final extends JFrame
ne sert à rien, c'est
JFrame fenetre = new JFrame();
qui compte.

Remarque 2
SwingUtilities.invokeLater(new Runnable() {
ne sert à rien non plus.

Remarque 3
fenetre.setVisible(true);
doit venir en dernier, en tout cas après
fenetre.setSize(200, 300);
sinon la fenêtre sera affichée avant d'être complètement configurée.

Remarque 4
par défaut, fermer la JFrame n'arrête pas le programme, ça n'affiche plus rien, tu ne peux plus rien faire avec, mais le processus continue d'exister ce qui pollue ta machine. Tu devrais ajouter cette ligne de code
fenetre.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
pour fermer proprement le programme.

Exemple

import java.awt.BorderLayout; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent;  import javax.swing.JButton; import javax.swing.JFrame;  public class Final {      public static void main(String[] args) {         Polygone ds = new Polygone();          JButton bouton = new JButton("afficher");         bouton.addMouseListener(new MouseAdapter() {             @Override             public void mouseClicked(MouseEvent e) {                 int[] x = { 200, 30, 50, 60, 60, 50, 30, 20 };                 int[] y = { 30, 20, 20, 30, 50, 60, 60, 500 };                 ds.polygon(x, y);             }         });          JFrame fenetre = new JFrame();         fenetre.add(bouton, BorderLayout.NORTH);         fenetre.add(ds, BorderLayout.CENTER);         fenetre.setSize(250, 600);         fenetre.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);         fenetre.setVisible(true);     } }

import java.awt.Component; import java.awt.Graphics;  public class Polygone extends Component {      private static final long serialVersionUID = 1;      private int[] x = {};     private int[] y = {};      @Override     public void paint(Graphics g) {         g.drawPolygon(x, y, Math.min(x.length, y.length));     }      public void polygon(int[] x, int[] y) {         this.x = x;         this.y = y;         repaint();     } }

Merci KX 1

Avec quelques mots c'est encore mieux Ajouter un commentaire

CCM a aidé 22503 internautes ce mois-ci

Reply
réponses:
  • auteur

  • lallana2re

    Tu sais le extends Component je le fait pour pouvoir appeler la methode repaint();
    ou bien il y'a une autre methode ??

  • KX

    Le extends Component est indispensable pour manipuler un objet AWT/Swing.
    Par exemple la méthode

    fenetre.add(ds);
    serait impossible si ds n'est pas un Component.

  • lallana2re

    Je voulais savoir aussi à quoi sert ----> SwingUtilities.invokeLater

  • lallana2re

    Salut Chef , jai encore un blem , le probleme en ai si je clique sur le rectangle puis le cercle et que je veux changer la couleur , au lieu de changer la couleur du cercle , il redessine  un rectangle en fonction des couleurs choisies et pourtant jai bien reinitialiser les valeurs , à chaque fois que tu clique sur rectangle ou cercle mais toujours po de solution ton aide SVP.  

    class Graphic :

    import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import javax.swing.JPanel;  public class Graphic extends JPanel {      int u = 0, x = 0, y = 0, z = 0;     int u1 = 0, x2 = 0, y3 = 0, z4 = 0;     Color couleur = Color.black;     Color couleur1 = Color.black;      public Graphic() {         setPreferredSize(new Dimension(300, 300));     }      public void paint(Graphics g) {          super.paint(g);         g.setColor(couleur);         g.drawRect(u, x, y, z);         g.setColor(couleur1);         g.drawOval(u1, x2, y3, z4);      }      public void rect(int u, int x, int y, int z, Color couleur) {         this.u = u;         this.x = x;         this.y = y;         this.z = z;         this.couleur = couleur;          repaint();      }      public void cer(int u1, int x2, int y3, int z4, Color couleur1) {         this.u1 = u1;         this.x2 = x2;         this.y3 = y3;         this.z4 = z4;         this.couleur1 = couleur1;          repaint();      }  }


    class AppPaint :

    import java.awt.Color; import java.awt.Event; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent;  import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JPanel;  public class AppPaint extends JFrame {      public AppPaint() {          Graphic cg = new Graphic();         JPanel Pan = new JPanel();         JPanel jp = new JPanel();          JButton bouton1 = new JButton("rectangle");         JButton bouton = new JButton("cercle");          String[] tableau = { "bleu", "rouge", "jaune" };         JComboBox c1 = new JComboBox(tableau);          this.add(Pan);         Pan.add(jp);         Pan.add(c1);         Pan.add(bouton1);         Pan.add(bouton);         Pan.add(cg);          bouton1.addMouseListener(new MouseAdapter() {             public void mouseClicked(MouseEvent arg0) {                  cg.rect(100, 100, 100, 100, Color.black);                 cg.cer(0, 0, 0, 0, Color.blue);                  class EcouteurBox implements ItemListener {                      @Override                     public void itemStateChanged(ItemEvent e) {                          if (e.getSource() == c1) {                             if (c1.getSelectedItem().equals("bleu")) {                                  cg.rect(100, 100, 100, 100, Color.blue);                                 cg.cer(0, 0, 0, 0, Color.blue);                              } else if (c1.getSelectedItem().equals("rouge")) {                                  cg.rect(100, 100, 100, 100, Color.red);                                 cg.cer(0, 0, 0, 0, Color.blue);                              } else if (c1.getSelectedItem().equals("jaune")) {                                  cg.rect(100, 100, 100, 100, Color.yellow);                                 cg.cer(0, 0, 0, 0, Color.blue);                              }                          }                     }                  }                  c1.addItemListener(new EcouteurBox());              }         });          bouton.addMouseListener(new MouseAdapter() {             public void mouseClicked(MouseEvent arg0) {                  cg.cer(100, 100, 100, 100, Color.black);                 cg.rect(0, 0, 0, 0, Color.black);                  class EcouteurBox implements ItemListener {                      @Override                     public void itemStateChanged(ItemEvent e) {                          if (e.getSource() == c1) {                             if (c1.getSelectedItem().equals("bleu")) {                                  cg.cer(100, 100, 100, 100, Color.blue);                                 cg.rect(0, 0, 0, 0, Color.black);                              } else if (c1.getSelectedItem().equals("rouge")) {                                  cg.cer(100, 100, 100, 100, Color.red);                                 cg.rect(0, 0, 0, 0, Color.black);                              } else if (c1.getSelectedItem().equals("jaune")) {                                  cg.cer(100, 100, 100, 100, Color.yellow);                                 cg.rect(0, 0, 0, 0, Color.black);                              }                          }                     }                  }                  c1.addItemListener(new EcouteurBox());              }         });          this.setSize(400, 400);         this.setTitle("Application de paint");         this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);         this.setVisible(true);     }      public static void main(String arg[]) {         new AppPaint();      }  }

  • KX

    "Je voulais savoir aussi à quoi sert ----> SwingUtilities.invokeLater"
    AWT/Swing a un thread unique qui gère tous les événements sur l'interface graphique (Event Dispatch Thread), si on veut faire des threads supplémentaires il faut les soumettre à l'EDT (via la méthode invokeLater) pour qu'il gère correctement les conflits l'affichage. Voir la documentation : https://docs.oracle.com/javase/10/docs/api/javax/swing/SwingUtilities.html#invokeLater(java.lang.Runnable)

    Quant à ton problème avec les cercles, c'est juste que tu as ajouté

    c1.addItemListener(new EcouteurBox());
    deux fois (une pour le cercle, une pour le rectangle), et qu'à chaque fois que tu sélectionnes une couleur, les deux méthodes sont appelées (dessin du cercle et dessin du rectangle), sauf que la seconde effaçant la première tu ne vois toujours que le dessin du rectangle, jamais celui du cercle.

    Globalement, il faudrait tout revoir, là tu mélanges un peu tout avec des classes qui dessinent à la fois des cercles et des rectangles, ce sera ingérable si tu veux faire d'autres formes.

    Exemple :

    import java.awt.Color;  public enum Couleur {     Bleu(Color.BLUE), Rouge(Color.RED), Jaune(Color.YELLOW);      public final Color color;      private Couleur(Color color) {         this.color = color;     } }

    import java.awt.*; import java.util.function.Consumer;  public class Graphic extends Component {      private static final long serialVersionUID = 1L;      private Color color = Color.BLACK;     private Consumer<Graphics> instructions = g -> {};      @Override     public void paint(Graphics g) {         super.paint(g);         g.setColor(color);         instructions.accept(g);     }      public void setColor(Color color) {         this.color = color;         repaint();     }      public void setInstructions(Consumer<Graphics> instructions) {         this.instructions = instructions;         repaint();     } }

    import java.awt.*; import javax.swing.*;  public class AppPaint {      public static void main(String arg[]) {         Graphic graphic = new Graphic();         graphic.setPreferredSize(new Dimension(300, 300));          JComboBox<Couleur> colorSelector = new JComboBox<>(Couleur.values());         colorSelector.addItemListener(e ->             graphic.setColor(((Couleur) colorSelector.getSelectedItem()).color));          JButton rectangleButton = new JButton("rectangle");         rectangleButton.addActionListener(e ->             graphic.setInstructions(g -> g.drawRect(100, 100, 100, 100)));          JButton cercleButton = new JButton("cercle");         cercleButton.addActionListener(e ->             graphic.setInstructions(g -> g.drawOval(100, 100, 100, 100)));          JFrame frame = new JFrame();         frame.setTitle("Application de paint");         frame.setSize(400, 400);         frame.setLayout(new FlowLayout());         frame.add(colorSelector);         frame.add(rectangleButton);         frame.add(cercleButton);         frame.add(graphic);         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);         frame.setVisible(true);     } }

  • lallana2re

    Un grand merci , ça ma beaucoup servi .Bon moi puisque je suis un débutant en java donc je voulais un éclaircissement sur les symboles que vs avez utilisé (g -> ... , JCombobox<graphics>, etc...)


    private Consumer<Graphics> instructions = g -> {};

    Bleu(Color.BLUE), Rouge(Color.RED), Jaune(Color.YELLOW) ;


    instructions.accept(g);
    le mot cle accept joue le mm role que add ?

  • KX

    Ce que tu demandes d'expliquer ce sont les syntaxes natives du langage Java, donc je vais surtout te renvoyer vers la documentation : Learning the Java Language

    Pour

    Bleu(Color.BLUE), Rouge(Color.RED), Jaune(Color.YELLOW);

    Ici j'ai utilisé
    public enum Couleur 
    , c'est un peu comme une
    public class Couleur
    mais avec un nombre limité de valeurs possibles (on ne pourra pas faire de
    new Couleur
    )
    La liste
    Bleu, Rouge, Jaune;
    correspondant à la liste exhaustive des différentes valeurs possibles.
    Voir : Enum Types

    JCombobox<Couleur>
    (NB. je n'ai jamais écrit JCombobox<graphics> ça n'aurait aucune utilité)
    Si tu regardes la documentation de JCombobox elle est définie
    public class JComboBox<E>

    Avec "E - the type of the elements of this combo box" et tu as des méthodes comme addItem​(E item) ou le constructeur JComboBox​(E[] items) qui prenne en paramètre le type paramétré "E".
    C'est à dire que si je définis un
    JCombobox<Couleur>
    , la méthode devient
    addItem​(Couleur item)
    et le constructeur
    JComboBox​(Couleur[] items)
    . Voir : Generic Types

    Pour
    Consumer<Graphics> instructions = g -> {}
    , dans tes codes précédents tu avais fait ceci :
    SwingUtilities.invokeLater(new Runnable() { public void run() { ... } });
    .
    C'est à dire que tu as implémenté l'interface Runnable dans une classe anonyme, pour définir le comportement de son unique méthode
    run()
    et le passer en paramètre de la méthode invokeLater.
    Cette écriture peut être allégée en faisant
    SwingUtilities.invokeLater(() -> { ... });

    Le
    ()
    correspond au paramètre de
    run()
    et
    { ... }
    c'est son contenu. On n'a pas besoin de préciser que c'est une classe qui implémente Runnable, Java le déduit vu que c'est la méthode
    invokeLater(Runnable)
    qui est utilisée. De même il est inutile de préciser que c'est la méthode
    run()
    vu que de toute façon il n'y en a qu'une.
    Dans mon code, ce que j'ai fait c'est une méthode
    setInstructions(Consumer<Graphics> instructions)
    qui prends en paramètre un Consumer<T> (où T=Graphics) et dont l'unique méthode est
    accept(T t)
    , c'est à dire
    accept(Graphics t)
    pour notre cas.
    Cela me permet donc d'écrire
    setInstructions(g -> g.drawRect(100, 100, 100, 100));
    qui revient au même qu'écrire le code suivant (qui est plus long...)
    setInstructions(new Consumer<Graphics>() {     public void accept(Graphics g) {         g.drawRect(100, 100, 100, 100);     } }
    Quant à
    instructions.accept(g);
    il s'agit donc juste d'appeler la méthode accept ainsi définie en lui passant en paramètre g, c'est à dire faire
    g.drawRect(100, 100, 100, 100);
    dans ce cas.
    Voir Lambda Expressions

  • lallana2re

    ahhhh okk Frere tout est resolu , je tres bien compris merci!!!!!!!!!
    Super!!!

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed