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

  1. #1
    Candidat au Club
    Inscrit en
    Février 2010
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 12
    Points : 2
    Points
    2
    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 actif
    Inscrit en
    Juin 2008
    Messages
    189
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 189
    Points : 268
    Points
    268
    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
    Candidat au Club
    Inscrit en
    Février 2010
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 12
    Points : 2
    Points
    2
    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 actif
    Inscrit en
    Juin 2008
    Messages
    189
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 189
    Points : 268
    Points
    268
    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
    Candidat au Club
    Inscrit en
    Février 2010
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 12
    Points : 2
    Points
    2
    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 sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    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!

  7. #7
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 075
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 075
    Points : 7 981
    Points
    7 981
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    2) quelles sont les valeurs de getX et getY (car je note que tu ne les a toujours pas données) quand ca foire?
    Pas besoin de chercher plus loin c'est ca son problème je pense pour avoir lancé son code et avoir vu les valeurs

    Le rectangle vaut (xywh : 340,20, 120,35) dans le panel, or la souris au moment du clique sur "le rectangle" affiche en realité 340,100 ce qui effectivement va lui envoyer false.

    Greafs si tu clique X pixels plus haut tu verras que ca te retourne true.
    Je pense qu'il faudrait aussi eviter de changers les bounds du rectangle a l'interieur du paint (mais bon ...).
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  8. #8
    Candidat au Club
    Inscrit en
    Février 2010
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 12
    Points : 2
    Points
    2
    Par défaut
    Merci pour vos réponses.
    Effectivement, wax78 a totalement raison, merci pour avoir testé le code (et répondre par la même occasion à tchize_).

    Cependant, je ne comprend pas pourquoi il y a un tel décalage.
    Quelqu'un pourrait-il m'expliquer?

    @tchize_ :
    je vais essayé de reformuler ma question qui te semble si incohérente ^^.
    En fait, je dessine plusieurs "boutons" avec drawRoundRect (tous les 3 dessinés dans la variable 'lemenu').
    Au final, j'aurai plusieurs tests à faire avec les Rectangle2D, c'est-à-dire que je pensais faire par exemple 3 drawRoundRect, et donc 3 Rectangle2D.
    Etant donné cela, j'aurai donc 3 tests, du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    leMenu.getRect2D().contains(e.getX(),e.getY())
    Cependant, cette ligne fait appel à getRect2D(), et la valeur renvoyée ne varie pas selon le rectangle2D comme on a pu le constater précédemment, et c'est ça que j'aimerai rectifier.
    En espérant avoir été un peu plus clair.

    Merci à tous et bonne soirée

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    si t'as besoin de trois rectangle, tu crée trois champs, c'est tout.

    A noter que tes trois "boutons" sont dessinés décalés de 10pixels vers le bas par rapport aux coordonnées dans rectangle.

  10. #10
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 075
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 075
    Points : 7 981
    Points
    7 981
    Par défaut
    De la façon don tu fais, tu peux même utiliser une liste de rectangles. Et au moment du clique tu parcours la liste et tu regardes si un des éléments (rectangle) contient le point de ta souris. Ainsi tu pourras mettre autant de boutons que tu veux et n'importe ou de n'importe quel taille (sans recouvrements).
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  11. #11
    Candidat au Club
    Inscrit en
    Février 2010
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 12
    Points : 2
    Points
    2
    Par défaut
    @ tchize_ :
    En faisant cela, je devrai faire autant de setter et getter qu'il y a de "boutons", non?
    C'est là mon problème, je pensais qu'un seul et unique setter et getter pouvais gérer autant d'objet que l'on désire passer en argument.

    @wax78 :
    C'est en effet un peu comme cela que j'avais vu la chose, jusqu'à ce que je me heurte à ce problème. Du coup, je ne sais plus vraiment comment je dois faire.

    En ce qui concerne le décalage, avez-vous une idée pour régler ce dernier?

    Merci

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    un getter/setter, c'est pour une propriété. Maintenant, ta propriété peut très bien être une List<Rectangle2D>

  13. #13
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 075
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 075
    Points : 7 981
    Points
    7 981
    Par défaut
    Alllais, c'est bien parce qu'ajourd'hui c'est mon anniversaire :

    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
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    import java.awt.*;
    import javax.swing.*;
     
    import java.awt.event.ComponentEvent;
    import java.awt.event.ComponentListener;
    import java.awt.geom.*;
    import java.awt.geom.Rectangle2D.Double;
    import java.util.ArrayList;
     
    public class Menu extends JPanel implements ComponentListener {
     
    	private String menuTitle = "Bubble Game";
    	private int buttonWidth1 = 120;
    	private int buttonHeight = 35;
    	private int interButton = 10;
     
    	ArrayList<Rectangle2D> boutons = new ArrayList<Rectangle2D>();
     
    	public Menu()
    	{
    		setLayout(null);
    		setSize(800,600);
    		initboutons();
    		this.addComponentListener(this);
    	}
     
    	// Place les rectangle dans l'espace tels qu'il devraient etre.
    	public void initboutons()
    	{
    		int w = getWidth();
    		int h = getHeight();
    		boutons.clear();
    		for (int i = 0; i < 4; i++)
    		{
    			Rectangle2D rect = new Rectangle2D.Double();
    			rect.setRect(w/2-buttonWidth1/2, 20+(buttonHeight+interButton)*i, buttonWidth1, buttonHeight);
    			boutons.add(rect);
    		}
    	}
     
    	public void paint(Graphics gg) {
    		Graphics2D g = (Graphics2D)gg;
     
    		Font f1 = new Font("Arial",Font.PLAIN,60); 
    		g.setFont(f1);			   
    		FontMetrics fm = g.getFontMetrics();
     
    		Font f2 = new Font("Arial",Font.PLAIN,15);
    		g.setFont(f2);
    		FontMetrics fm2 = g.getFontMetrics();
    		for (int i = 0; i < boutons.size(); i++)
    		{
    			Rectangle2D rect =boutons.get(i); 
    			float x = (float) rect.getX();
    			float  y = (float)rect.getY();
    			float  w = (float)rect.getWidth();
    			float  h = (float)rect.getHeight();
    			g.drawRoundRect((int)x, (int)y, (int)w, (int)h, 10, 30);
    			g.drawString("Button_"+i,(int)x+w/2, (int)y+h/2);
    		}
    		g.drawString("Nouvelle partie",(getWidth()-fm2.stringWidth("Nouvelle partie"))/2,20+(buttonHeight+fm2.getAscent())/2);
     
    	}
     
    	@Override
    	public void componentHidden(ComponentEvent e)
    	{
    		// TODO Auto-generated method stub
     
    	}
     
    	@Override
    	public void componentMoved(ComponentEvent e)
    	{
    		// TODO Auto-generated method stub
     
    	}
     
    	@Override
    	public void componentResized(ComponentEvent e)
    	{
    		initboutons();
     
    	}
     
    	@Override
    	public void componentShown(ComponentEvent e)
    	{
    		// TODO Auto-generated method stub
     
    	}
     
    	public synchronized ArrayList<Rectangle2D> getBoutons()
    	{
    		return boutons;
    	}
     
    	public synchronized void setBoutons(ArrayList<Rectangle2D> boutons)
    	{
    		this.boutons = boutons;
    	}
     
     
    }
    et

    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
    import java.awt.*;
    import javax.swing.*;
    import java.awt.event.*;
    import java.awt.geom.*;
    import java.util.ArrayList;
     
    public class Example extends JFrame {
     
    	//private Container cont = new Container();
    	private Menu lemenu = new Menu();
     
    	public Example() {
    		super("Exemple");
    		setDefaultCloseOperation(EXIT_ON_CLOSE);
     
    	//	setLocationRelativeTo(null);
     
    		//lemenu.setPreferredSize(new Dimension(800,600)); // A rajouter.
    		//lemenu.setMinimumSize(new Dimension(800,600)); // A rajouter.
     
    		getContentPane();
    		setLayout(new BorderLayout());
    		add(lemenu, BorderLayout.CENTER);lemenu.addMouseListener(new MouseAdapter() {
    			public void mouseClicked(MouseEvent e) { 
    				System.err.println("Point cliqué "+e.getX()+","+e.getY());
    				ArrayList<Rectangle2D> rects = lemenu.getBoutons();
    				for (int i = 0; i < rects.size(); i++)
    				{
    					Rectangle2D r = rects.get(i);
    					if(r.contains(e.getX(),e.getY())) 	System.out.println("Je clique sur bouton "+i);
    				}
     
    			}
    		});
    		setSize(800,600);
    		setVisible(true);
    	}
     
    	public static void main(String[] args) {
    		new Example();
    	}
    }
    Ceci devrait te permettre de repartir vers de nouveau horizon (contenant moultes porcheries certes, car le midi fut boissonique ... j'ai fait ca rapidos).

    Si tu t'en inspire tu pourras faire un beau petit menu d'après moi

    PS : Veille bien a fair eattention quand tu utilise ton null layout, j'suis passé a un borderlayout dans mon exemple car ton exemple etait un peu etrange. (meme si j'ai utilisé null layout pdt tout un temp).
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  14. #14
    Candidat au Club
    Inscrit en
    Février 2010
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 12
    Points : 2
    Points
    2
    Par défaut
    Merci pour la portion de code ! Je vais regarder ça attentivement, et bon anniversaire ! (en retard, certes^^).

    Pour finir la discussion, quelqu'un a une réponse à ce fameux décalage d'ordonnée?

    Merci =)

  15. #15
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 075
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 075
    Points : 7 981
    Points
    7 981
    Par défaut
    Bah mieux vaut tard que jamais comme on dit Merci a toi.

    Pour le décalage je pense me souvenir (mais plus certains) que c'etait a cause du null layout et des setbounds (enfin un truc dans ce gout la je me rapelle plus trop).
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  16. #16
    Candidat au Club
    Inscrit en
    Février 2010
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 12
    Points : 2
    Points
    2
    Par défaut
    Bonsoir à tous,

    j'ai encore deux petites questions :

    au niveau des arguments :

    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
    4
    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)

    D'autre part, à quoi est dû le décalage?


    Merci et bonne soirée à tous

  17. #17
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 075
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 075
    Points : 7 981
    Points
    7 981
    Par défaut
    Elle m'a l'air plus que suspecte cette fonction, voire totalement inutile
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  18. #18
    Expert éminent

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 813
    Détails du profil
    Informations personnelles :
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Fabricant et casseur d'avions
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 813
    Points : 7 641
    Points
    7 641
    Par défaut
    Salut

    Citation Envoyé par greasf Voir le message
    Pourquoi l'accesseur n'a pas besoin de prendre d'argument, alors que la méthode retourne l'objet en question?

    (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)
    Il va falloir revoir tes cours de programmation objet en java... comment marche une classe, qu'est-ce qu'un accesseur/mutateur, les données membres, les méthodes, etc etc...

    Pourquoi passer une donnée membre en paramètre alors que la méthode travaille directement sur l'objet?
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com

  19. #19
    Candidat au Club
    Inscrit en
    Février 2010
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 12
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par plegat Voir le message
    Pourquoi passer une donnée membre en paramètre alors que la méthode travaille directement sur l'objet?
    Peux-tu développer cette phrase? Elle m'a (peut-être) permis de comprendre, mais je ne suis pas bien sur.

    Merci d'avance

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    la question est: pourquoi passer en paramètre l'objet à récupérer. Le but est justement de le récupérer, donc a priori on ne l'a pas et je vois pas ce qu'on pourrais passer en paramètre à ton getter!

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