Besoin d'aide avec un programme Java graphique
SnPsn -
Bonjour,
Je suis ici pour demander de l'aide, parce que je n'arrive pas a coder mon programme. J'ai crée un composant de dessin CercleCool.java(classe qui dérive de JPanel) qui dessinera deux cercles superposés.
Le grand cercle est bleu et plein, et possède un diamètre de 80 pixels
Le petit cercle est tracé à l’aide d’un contour de couleur jaune, et son diamètre sera toujours égal à 75% de celui du grand cercle (du coup moi, j'ai fait (80*75)/100, parce que ca m'a semblé logique... Si c'est une erreur, que quelqu'un me fasse signe s'il vous plait!)
Une ligne horizontale rouge le sépare en deux: (j'utilise un objet Line2D.Doubl) et les traits ont une largeur de 5 pixels et l'anticrénelage est activé.
Aussi les cercles devront être toujours exactement centrés dans le composant de dessin, peu importe la taille des cercles et la taille du composant
En voici une image :
Seulement, je n'arrive pas a mettre la ligne horizontale rouge qui sépare les cercles. Je n'arrive pas non plus a mettre de l'épaissir (mon 5 pixels) sur mon cercle jaune SANS le fill
C'est ce que je veux avoir :

Voici le code de ma classe CercleCool.java
import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.awt.BasicStroke; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.geom.Ellipse2D; import java.awt.geom.Line2D; import javax.swing.JFrame; import javax.swing.JPanel; public class CercleCool extends JPanel { private static final long serialVersionUID = 1L; private Ellipse2D.Double cercleCentreB, cercleCentreJ, cercleContour; private double coinX1 = 30, coinY1=50; private double diametreCercleB = 80; private double diametreCercleJ = ((80*75)/100); double contour = 5; public CercleCool() { setBackground(Color.BLACK); //arriere-plan setPreferredSize(new Dimension(400,150)); //initial mais redimensionnable } public void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2d = (Graphics2D) g; cercleCentreB = new Ellipse2D.Double(getWidth()/2.0-diametreCercleB/2.0, getHeight()/2.0-diametreCercleB/2.0, diametreCercleB, diametreCercleB); g2d.setStroke( new BasicStroke(1) ); g2d.setColor( Color.BLUE ); g2d.draw(cercleCentreB); g2d.fill(cercleCentreB); cercleCentreJ = new Ellipse2D.Double(getWidth()/2.0-diametreCercleJ/2.0, getHeight()/2.0-diametreCercleJ/2.0, diametreCercleJ, diametreCercleJ); g2d.setStroke(new BasicStroke(1)); g2d.setColor( Color.YELLOW); g2d.draw(cercleCentreJ); g2d.setColor(Color.RED); g2d.draw(new Line2D.Double()); } }
Merci a la personne qui pourra m'aider :(
- Besoin d'aide avec un programme Java graphique
- Waptrick java football - Télécharger - Jeux vidéo
- Jeux java itel - Télécharger - Jeux vidéo
- Changer carte graphique - Guide
- Eclipse java - Télécharger - Langages
- Java apk - Télécharger - Langages
1 réponse
Bonjour,
Concernant ta ligne rouge, tu as fait g2d.draw(new Line2D.Double()); mais c'est insuffisant car tu ne précises pas ses coordonnées ! Par défaut ça trace une ligne du point (0,0) vers le point (0,0), c'est à dire un unique point rouge tout en haut à gauche (il faut avoir de bon yeux, mais on le devine sur ton image)
Tu devrais plutôt utiliser le constructeur Line2D.Double(x1, y1, x2, y2)
Quant à l'épaisseur de ton cercle jaune, tu as fait g2d.setStroke(new BasicStroke(1));
Erreur d'étourderie : tu devrais mettre 5 à la place du 1...
Enfin, pour le crénelage tu peux faire :
g2d.setRenderingHints( new RenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON) );
Remarque : il n'est pas nécessaire de faire ton dessin dans un JPanel (un containeur d'autres objets), tu pourrais considérer d'étendre un java.awt.Component (l'objet le plus simple - donc le plus performant), il n'y aurait qu'à changer la méthode paintComponent en paint et garder tout le reste de ton code à l'identique.
Merci beaucoup pour votre réponse!
Pour la ligne rouge, je sais bien que je dois mettre les coordonnées des x et des y, seulement, je n'arrive pas a les situer. J'en suis rendue pour mettre Line2D.Double(0, 0, 180, 120)
Je sais que ce n'est pas bon, vu que j'ai une ligne inclinée et qui passe par tous les points du panel et non pas des deux extrémités de mon cercle jaune. Seulement, comme je l'ai dit, je n'arrive pas a percevoir les dimensions en java, d'où ca commence, d'où ca se termine, comment ca se positionne, etc... (on peut dire que je tape a l'aveugle des chiffres en espérant tomber sur les bonnes coordonnées...)
Finalement, comme dernier soucis, j'ai ajouté un JSpinner représentant le diamètre du grand cercle (initialisé à 80). Dès que l’utilisateur change la valeur (entière) du JSpinner, le tout s’ajuste en restant proportionnel et centré (donc le cercle jaune ainsi que la ligne médiane). J'ai pensé a rajouter une méthode setAgrandir() (dans ma classe principale d'exécution), qui appelle un getDiamètre puis qui prend le 80 et le modifie (mais c'est plus complexe que ce que j'avais imaginé...) Puis peut-être que ce n'est pas la meilleure façon de faire.
PS : le seul panel affecté par le code est celui de gauche. Modifier le 2e a droite n'est pas voulu (on peut l'ignorer)
Voici le code de ma classe graphique :
Code de ma classe main :
PS : mon bouton radio bleu ne fonctionne pas, mais je n'arrive pas a savoir pourquoi alors que j'y passe des heures dessus.
PS2 : juste prévenir que je suis encore un étudiant. Je fais mes débuts dans la programmation encore... Pour le moment donc je ne sais travailler qu'avec la méthode paintComponent
Bonjour,
Chaque méthode est différente et il faut regarder sa documentation pour savoir à quoi correspond chaque paramètre
Ensuite, il faut organiser ses idées et ne pas se laisser tenter par un copier-coller un peu trop facile. Si tu as besoin d'une valeur plusieurs fois, stockes là dans une variable dédiée, bien nommée, ça évite ensuite de se mélanger les pinceaux.
Par exemple tu ne devrais pas écrire :
Mais tu devrais écrire :
Ainsi ta ligne se trace comme ceci :
Quant à ton JSpinner, ce n'est pas si compliqué que ça, tu as déjà mis le ChangeListener dans ton code, il n'y aurait donc que deux lignes à ajouter :
Il faut bien sur créer cette méthode dans CercleCool :
PS. Vu que le diametreCercleJ est calculé à partir du diametreCercleB, il faudrait plutôt mettre ce calcul dans la méthode paintComponent, sinon la valeur ne sera pas recalculée à chaque affichage et le cercle jaune ne sera pas redimensionné.
Alors, merci beaucoup, tout fonctionne pour le calcul, etc.
Tout ce qui ne fonctionne pas, c'est la ligne rouge et les radios boutons (seulement le bouton bleu pour une raison qui m'échappe).
Pour la ligne rouge, j'ai exactement reproduit ce que vous m'aviez montré, en mettant bien cette fois-ci des noms de variables au lieu de chiffres. Ca ne fonctionne pas malgré tout...
Pour le bouton bleu, aucune idée
Code :
Code méthode dans la classe CercleCool :
Il faudrait que tu remettes ton code complet pour déboguer la partie sur la ligne rouge, vu où elle est placée je dirais que tu utilises des valeurs qui valent 0 au lieu de correctement les calculer.
Pour le changement de couleur je ne comprends pas pourquoi tu as deux variables couleurVoulu et couleurInitial, une seule devrait suffire que tu pourrais renommer couleurGrandCercle.
Au départ j'en avais qu'une seule, comme ca ne marchait pas j'en ai mis deux...