Afficher Polygon en un clic avc passage d'argument

Résolu/Fermé
lallana2re Messages postés 19 Date d'inscription lundi 2 avril 2018 Statut Membre Dernière intervention 6 novembre 2020 - Modifié le 8 avril 2018 à 11:23
lallana2re Messages postés 19 Date d'inscription lundi 2 avril 2018 Statut Membre Dernière intervention 6 novembre 2020 - 18 avril 2018 à 17:28
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();
 }
}
A voir également:

1 réponse

KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
8 avril 2018 à 12:12
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();
    }
}
1
lallana2re Messages postés 19 Date d'inscription lundi 2 avril 2018 Statut Membre Dernière intervention 6 novembre 2020
12 avril 2018 à 16:52
Tu sais le extends Component je le fait pour pouvoir appeler la methode repaint();
ou bien il y'a une autre methode ??
0
lallana2re Messages postés 19 Date d'inscription lundi 2 avril 2018 Statut Membre Dernière intervention 6 novembre 2020
12 avril 2018 à 18:02
Je voulais savoir aussi à quoi sert ----> SwingUtilities.invokeLater
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015 > lallana2re Messages postés 19 Date d'inscription lundi 2 avril 2018 Statut Membre Dernière intervention 6 novembre 2020
12 avril 2018 à 18:04
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.
0
lallana2re Messages postés 19 Date d'inscription lundi 2 avril 2018 Statut Membre Dernière intervention 6 novembre 2020
Modifié le 16 avril 2018 à 13:02
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();

    }

}
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015 > lallana2re Messages postés 19 Date d'inscription lundi 2 avril 2018 Statut Membre Dernière intervention 6 novembre 2020
Modifié le 16 avril 2018 à 15:43
"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);
    }
}
0