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
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
A voir également:
- Afficher Polygon en un clic avc passage d'argument
- Windows 11 clic droit afficher plus d'options par défaut - Guide
- Passage qwerty azerty - Guide
- Afficher mot de passe wifi android - Guide
- Passage windows 7 à 10 - Guide
- Afficher appdata - Guide
1 réponse
KX
Messages postés
16733
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
31 janvier 2024
3 014
8 avril 2018 à 12:12
8 avril 2018 à 12:12
Bonjour,
Problème 1
Quand tu fais
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
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
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
Remarque 2
Remarque 3
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
Exemple
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 JFramene 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(); } }
12 avril 2018 à 16:52
ou bien il y'a une autre methode ??
12 avril 2018 à 18:02
12 avril 2018 à 18:04
Par exemple la méthode serait impossible si ds n'est pas un Component.
Modifié le 16 avril 2018 à 13:02
class Graphic :
class AppPaint :
Modifié le 16 avril 2018 à 15:43
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é 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 :