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

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();
	}
}
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
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;
	}
}
Lorsque j'exécute ce code, le résultat fourni par :

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");
me retourne toujours 'false' (d'où le problème, car même quand je clique à l'intérieur du Rectangle2D correspondant, j'ai false)

D'autre part, je pense qu'il s'agit (peut-être) de l'accesseur et du mutateur suivant qui sont mal programmés.

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;
	}
En effet, la ligne
Code : Sélectionner tout - Visualiser dans une fenêtre à part
System.out.println(lemenu.getRect2D());
de la classe Example me retourne :

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]
(ce qui correspond parfaitement à mon Rectangle2D !)

Or, quand je change le nom de rect2d en rect par exemple, au sein de l'accesseur et du mutateur, je me retrouve avec :
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]
Je pense donc que j'utilise mal cet accesseur et ce mutateur, mais je ne vois pas comment m'y prendre autrement.

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

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
public Rectangle2D getRect2D(Rectangle2D rect2d) {
		return rect2d;
	}
(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)

Merci d'avance et bonne soirée à tous