Bonsoir à tous,
je me pose certaines questions concernant la méthode contains applicables à des Rectangle2D car elle n'a jamais fonctionnée chez moi (alors que tout compile et s'exécute parfaitement).
Voici tout d'abord mes codes sources :
Classe Example.java
Voici ensuite la classe Menu.java :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39 import java.awt.*; import javax.swing.*; import java.awt.event.*; import java.awt.geom.*; public class Example extends JFrame { private Container cont = new Container(); private PanRoundButton pan = new PanRoundButton(); private Menu lemenu = new Menu(); private Rectangle2D rect2d = new Rectangle2D.Double(); public Example() { super("Exemple"); setDefaultCloseOperation(EXIT_ON_CLOSE); setSize(800,600); setLocationRelativeTo(null); cont = getContentPane(); cont.setLayout(null); cont.add(lemenu); cont.add(pan); pan.setBounds(0,0,800,600); lemenu.setBounds(0,0,800,600); lemenu.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { System.out.println(lemenu.getRect2D()); if(lemenu.getRect2D().contains(e.getX(),e.getY())) System.out.println("true"); else System.out.println("false"); } }); setVisible(true); } public static void main(String[] args) { new Example(); } }
Lorsque j'exécute ce code, le résultat fourni par :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48 import java.awt.*; import javax.swing.*; import java.awt.geom.*; public class Menu extends JPanel { private String menuTitle = "Bubble Game"; private int buttonWidth1 = 120, buttonWidth2 = 120, buttonWidth3 = 120; private int buttonHeight = 35; private int interButton = 10; private Rectangle2D rect = new Rectangle2D.Double(); private Rectangle2D rect2d = new Rectangle2D.Double(); public Menu() { } public void paint(Graphics gg) { Graphics2D g = (Graphics2D)gg; Font f1 = new Font("Arial",Font.PLAIN,60); g.setFont(f1); FontMetrics fm = g.getFontMetrics(); g.drawString(menuTitle,(getWidth()-fm.stringWidth(menuTitle))/2,fm.getAscent()+10); g.drawLine(70,fm.getHeight()+10,getWidth()-70,fm.getHeight()+10); g.translate(0,fm.getHeight()+10); Font f2 = new Font("Arial",Font.PLAIN,15); g.setFont(f2); FontMetrics fm2 = g.getFontMetrics(); g.drawRoundRect((getWidth()-buttonWidth1)/2,20,buttonWidth1,buttonHeight,10,30); g.drawRoundRect((getWidth()-buttonWidth2)/2,20+buttonHeight+interButton,buttonWidth2,buttonHeight,10,30); g.drawString("Nouvelle partie",(getWidth()-fm2.stringWidth("Nouvelle partie"))/2,20+(buttonHeight+fm2.getAscent())/2); g.drawRoundRect((getWidth()-buttonWidth3)/2,20+buttonHeight+interButton+buttonHeight+interButton,buttonWidth3,buttonHeight,10,30); rect2d.setRect((getWidth()-buttonWidth1)/2,20,buttonWidth1,buttonHeight); g.draw(rect2d); } public Rectangle2D getRect2D() { return rect2d; } public void setRect2D(Rectangle2D rect2d) { this.rect2d = rect2d; } }
me retourne toujours 'false' (d'où le problème, car même quand je clique à l'intérieur du Rectangle2D correspondant, j'ai false)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 if(lemenu.getRect2D().contains(e.getX(),e.getY())) System.out.println("true"); else System.out.println("false");
D'autre part, je pense qu'il s'agit (peut-être) de l'accesseur et du mutateur suivant qui sont mal programmés.
En effet, la ligne
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 public Rectangle2D getRect2D() { return rect2d; } public void setRect2D(Rectangle2D rect2d) { this.rect2d = rect2d; }de la classe Example me retourne :
Code : Sélectionner tout - Visualiser dans une fenêtre à part System.out.println(lemenu.getRect2D());
(ce qui correspond parfaitement à mon Rectangle2D !)
Code : Sélectionner tout - Visualiser dans une fenêtre à part java.awt.geom.Rectangle2D$Double[x=340.0,y=20.0,w=120.0,h=35.0]
Or, quand je change le nom de rect2d en rect par exemple, au sein de l'accesseur et du mutateur, je me retrouve avec :
Je pense donc que j'utilise mal cet accesseur et ce mutateur, mais je ne vois pas comment m'y prendre autrement.
Code : Sélectionner tout - Visualiser dans une fenêtre à part java.awt.geom.Rectangle2D$Double[x=0.0,y=0.0,w=0.0,h=0.0]
Si quelqu'un pouvait donc éclairer ma lanterne...
Une dernière petite question (à part) :
Pourquoi l'accesseur n'a pas besoin de prendre d'argument, alors que la méthode retourne l'objet en question?
Par exemple, ici, pourquoi n'écrit-on pas
(je pause cette question car il n'y a pas que l'accesseur qui fonctionne comme cela. Pas mal de méthodes utilisent des variables pour 'travailler dessus' alors que ces dernières ne passent pas spécialement en argument, et ça, je ne vois pas du tout pourquoi)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 public Rectangle2D getRect2D(Rectangle2D rect2d) { return rect2d; }
Merci d'avance et bonne soirée à tous
Partager