IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

2D Java Discussion :

Méthode contains() d'un Rectangle2D


Sujet :

2D Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Inscrit en
    Février 2010
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 12
    Par défaut Méthode contains() d'un Rectangle2D
    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

  2. #2
    Membre éprouvé
    Inscrit en
    Juin 2008
    Messages
    189
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 189
    Par défaut
    Citation Envoyé par greasf Voir le message
    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]
    Bah, si tu fais ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    	public void setRect2D(Rectangle2D rect2d) {
    		this.rect  = rect;
    	}
    C'est clair que ça va pas faire grand chose.


    On peut voir ton e.getX() et e.getY().
    La position de la souris correspond à la position sur le panel.

  3. #3
    Membre habitué
    Inscrit en
    Février 2010
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 12
    Par défaut
    Non, en fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    	public void setRect2D(Rectangle2D rect2d) {
    		this.rect2d  = rect2d;
    	}
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     	public void setRect2D(Rectangle2D rect) {
    		this.rect  = rect;
    	}
    me retournent deux résultats différents, ce qui n'est pas normal (?).

    Le premier 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]
    et le deuxième me retourne :
    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]
    (étant donné la déclaration suivante : )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    private Rectangle2D rect = new Rectangle2D.Double();
    private Rectangle2D rect2d = new Rectangle2D.Double();
     
    rect2d.setRect((getWidth()-buttonWidth1)/2,20,buttonWidth1,buttonHeight);
    Or, l'accesseur et le mutateur sont censés fonctionner quelque soit l'objet, donc, je ne vois pas pourquoi, dès que je change l'argument, ça change le résultat. Pour moi, c'est selon l'appel qu'on y fait qui doit changer les résultats, non?

    Voici mes getX() et getY() :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    cont.addMouseListener(new MouseAdapter() {
    			public void mouseClicked(MouseEvent e) { 
    				System.out.println(myMenu.getRect2D());
    				if(leMenu.getRect2D().contains(e.getX(),e.getY())) 	System.out.println("true");
    				else	System.out.println("false"); 
    			}
    		});
    (J'ai essayé d'appliquer l'écouteur au cont, à this, à lemenu, mais quelque soit le cas, il me retourne false)

    Merci d'avance

  4. #4
    Membre éprouvé
    Inscrit en
    Juin 2008
    Messages
    189
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 189
    Par défaut
    Citation Envoyé par greasf Voir le message
    Non, en fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    	public void setRect2D(Rectangle2D rect2d) {
    		this.rect2d  = rect2d;
    	}
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     	public void setRect2D(Rectangle2D rect) {
    		this.rect  = rect;
    	}
    me retournent deux résultats différents, ce qui n'est pas normal (?).

    Ca me parait normal. Tu as une variable private rect et une variable private rect2d. Si tu affiches l'autre, forcement ça sera (0,0,0,0)


    Quand je demandais tes getX et getY, c'était leur contenu
    A mon avis, tu as une incohérence entre ta notion de rectangle et la position réelle de la souris (la souris ne se fie qu'à la position dans le panel)

  5. #5
    Membre habitué
    Inscrit en
    Février 2010
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 12
    Par défaut
    J'ai affiché getX et getY, et il me retourne correctement la valeur de la position sur le panneau (dans l'angle supérieur gauche, j'ai bien (0,0), et dans l'angle inférieur droit, j'ai mon (800,600) définit).

    Comment faire alors pour que la ligne suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    leMenu.getRect2D().contains(e.getX(),e.getY())
    s'applique quelque soit le rectangle2D?

    C'est-à-dire pour que l'accesseur et le mutateur s'exécute quelque soit le Rectangle2D?

    Merci d'avance et bonne journée

  6. #6
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Citation Envoyé par greasf Voir le message
    Comment faire alors pour que la ligne suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    leMenu.getRect2D().contains(e.getX(),e.getY())
    s'applique quelque soit le rectangle2D?

    C'est-à-dire pour que l'accesseur et le mutateur s'exécute quelque soit le Rectangle2D?
    Ta question n'a ni queue ni tete. Soyons clair

    1) quels sont les limites de ton REctangle2D au moment du test?
    2) quelles sont les valeurs de getX et getY (car je note que tu ne les a toujours pas données) quand ca foire?

    Quand à ton rectangle2D: nettoie ton code déjà pour virer le rectangle2D que tu utilise pas, histoire de pas confondre les rectangels que tu utilise!

Discussions similaires

  1. Créer une liste et méthode contains
    Par cyraile dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 21/06/2007, 15h27
  2. ArrayList -> méthode contains() (pour algo de Dijsktra)
    Par Jeff_as_jefferson dans le forum API standards et tierces
    Réponses: 2
    Dernier message: 08/06/2007, 20h09
  3. Pas de méthode contains() sur un String
    Par Gamez29 dans le forum Langage
    Réponses: 5
    Dernier message: 29/05/2007, 13h57
  4. Réponses: 6
    Dernier message: 05/04/2007, 16h34
  5. méthode contains et utilisation
    Par kamos dans le forum Collection et Stream
    Réponses: 1
    Dernier message: 01/11/2006, 21h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo