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

Agents de placement/Fenêtres Java Discussion :

JFrame contenant 2 JPanels


Sujet :

Agents de placement/Fenêtres Java

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    318
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 318
    Points : 99
    Points
    99
    Par défaut JFrame contenant 2 JPanels
    Bonjour, je me creuse la cervelle pour faire communiquer 2 panels entre eux.

    J'ai une class JFrame qui créer 2 panels.
    L'un me sert de légende et l'autre pour afficher une carte d'un batiment.

    Je voudrais pouvoir en cliquant sur un bouton de la légende , charger dans la seconde frame une image correspondante au bouton cliquer.

    Merci d'avance,

  2. #2
    Membre actif Avatar de aDamas
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    260
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2004
    Messages : 260
    Points : 288
    Points
    288
    Par défaut
    Tu n'as qu'a passer à ton panel légende une instance du panel avec la carte. (Enfin, ça dépend comment tu as organisé ton code...)

  3. #3
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    ou passer par un objet de type controlleur qui connait les deux objets, et peut agir sur les deux (chant que tes deux panels doivent connaitre ton controlleur pour pouvoir appeler ses méthodes)
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    318
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 318
    Points : 99
    Points
    99
    Par défaut
    Tu n'as qu'a passer à ton panel légende une instance du panel avec la carte. (Enfin, ça dépend comment tu as organisé ton code...)
    Dans ma classe legende , je ne vois pas ce que tu veux dire.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    318
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 318
    Points : 99
    Points
    99
    Par défaut
    J'ai donc etendu ma legende à carte .

    mais il me demande de rajouter alors :
    "Le super constructeur implicite Plan() n'est pas défini. Vous devez explicitement appeler un autre
    constructeur"

  6. #6
    Membre chevronné
    Profil pro
    Fabrication GED
    Inscrit en
    Octobre 2005
    Messages
    1 405
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Fabrication GED

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 405
    Points : 1 958
    Points
    1 958
    Par défaut
    Lors de la construction du JFrame, tu commences par instancier ta classe Legende, ensuite tu instances ta classe Carte en passant l'instance de Legende au constructeur. Exemple
    dans la construction de la JFrame :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Legende leg=new Legend(...);
    Carte c=new Carte(leg);
    Il faudra donc une reference à la classe Legende dans la classe carte, et implémenter le constructeur qui va avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    class Carte extends JPanel{
       private Legende leg;
       ...
       public Carte(Legende leg){
          this.leg=leg;
          ...
       }
       ...
    }
    De cette manière, tu auras accès au Panel legende depuis ta classe carte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    if(clicked){
       this.legend.set(...);
    }

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 504
    Points : 288
    Points
    288
    Par défaut
    non, ce n'est pas logique que ta légende étende carte.... ce qu'il faut en fait c'est que soit ta legende connaise la carte, c'est à dire que tu lui passe dans son constructeur une carte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     Legend legend = new Legend(carte);
     
     
    // Constructeur :
    public Legend( Carte carte) {
    this.carte = carte;}
    comme ca quand tu click sur une bouton de ta légende :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
          buttonLegende.addActionListener(new java.awt.event.ActionListener() { 
          	public void actionPerformed(java.awt.event.ActionEvent e) {    
          		carte.doActionForThisButton(Carte.ACTION1);
          	}
          });
    chaque clique sur un bouton de ta legende fait reagir la carte. le plus simple c'est que tout tes boutton appellent la méthode : doActionForThisButton(constante) mais avec une action différente qui est déini par une contante genre :
    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
     
    public class Carte {
     
    private static final int ACTION1 = 0
    private static final int ACTION2 = 1
    ....
     
     
    public void doActionForThisButton(int action) {
        switch (action) {
        case ACTION1:
     
          break;
    ...
        default:
          break;
        }

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    318
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 318
    Points : 99
    Points
    99
    Par défaut
    J'ai fait ce que tu viens de me conseiller , mais la nouvelle fonction de la classe Carte , ne fait pas se que je voudrais , elle devrait dessiner sur la Carte un points.
    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
     
    public void Afficher_alarmes()
    	{
    		//connexion à la bdd, recuperation : nombre d'alarmes et leurs coordonnées
    		int nbA=2; //nombre d'alamres enregistrer
    		/* 
    		coord[i][0]; abscisse
    		coord[i][1]; ordonnée
    		*/
     
    		coord = new int[nbA][2];
    		coord[0][0]=100;
    		coord[0][1]=100;
     
    		coord[1][0]=20;
    		coord[1][1]=15;
     
    		this.g2d.drawRect(coord[0][0],coord[0][1],30,30);	
    	}
    Au lieu de dessiner sur le dessin du panel de la classe Carte , il efface des buttons qui sont sur ma legende. Ces bouttons je l'ai ai créer avec ma classe principale Jframe.

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 504
    Points : 288
    Points
    288
    Par défaut
    quand tu dis qu'il efface les bouton cela veux dire quoi ?
    deja c qui qui appelle Afficher_Alarme() ?
    car ce qui est bizaarre c que si tu veux dessiner toi meme, comme ce que tu fais un point c'est dans la méthode paintComponent qu'il faut le faire... et là j'ai peur de te dire des betises, mais tu va devoir créer une classe carte qui étend JPanel et c'est cette classe que tu ajoute a ta JFrame principale à coté de ta légende. et donc ta classe Carte surchargera la methode paintCOmponent :
    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
     
    public paintComponent(Graphics g) {
      Graphics2D = (Graphics2D) g;
      if (afficherAlarme) {
        int nbA=2; //nombre d'alamres enregistrer 
          coord = new int[nbA][2]; 
          coord[0][0]=100; 
          coord[0][1]=100; 
          coord[1][0]=20; 
          coord[1][1]=15; 
          this.g2d.drawRect(coord[0][0],coord[0][1],30,30);    
      }
    }
     
    public void Afficher_alarmes() 
       { 
       afficherAlarme = true;
       }
    je ne sais pas si j'ai été clair...

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    318
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 318
    Points : 99
    Points
    99
    Par défaut
    J'ai compris ce que tu veux dire , j'ai essayer et ca n'affiche rien.

    Rofl , y doit y a voir un prob , voila mon code du Plan (dessin) ;

    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
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.Image;
    import java.awt.MediaTracker;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;
     
    import javax.swing.BorderFactory;
    import javax.swing.JPanel;
    import javax.swing.JTextField;
     
    public class Plan extends JPanel implements MouseListener {
     
    	public
    	int x , y;
    	JTextField repere;
    	int first = 0;
    	Image image;
    	int[][] coord;
    	Graphics2D g2d;
     
    	boolean affichage = false;
     
    	public Plan(String nom)
    	{	
    		repere = new JTextField();
    		repere.setBounds(1,1,100,20);
    		this.add(repere);
     
    		this.setBorder(BorderFactory.createLineBorder(Color.black,2));
    		this.setLayout(null);
    		this.addMouseListener(this);
     
     
     
     
     
    		image=getToolkit().getImage(nom);
    		MediaTracker tracker=new MediaTracker(this); //a mettre danns un thread
    		 tracker.addImage(image,0);
    		 try {tracker.waitForID(0);}
    		  catch(InterruptedException e) {}
     
    	}
     
    	public void paint(Graphics g)
    	  {
    	super.paint(g);
    	g2d =(Graphics2D) g;
    	if(first==0)
    		{
    		g2d.setColor(Color.RED);
    		g2d.drawImage(image, 0, 0, this.getWidth(), this.getHeight(), this);
    		g2d.drawRect(90,310,150,60);	//siege sekurit
    		g2d.drawRect(215,390,120,45);	//achats
    		g2d.drawRect(135,452,90,35);	//MCV 1000
    		g2d.drawRect(82,540,100,40);	//Lateraux
    		g2d.drawRect(120,590,80,40);	//cdi sud
    		g2d.drawRect(204,583,80,40);	//eTUDES
    		g2d.drawRect(223,489,130,60);	//lUch
    		g2d.drawRect(404,519,80,60);	//sTOCK AUTO
    		g2d.drawRect(495,454,120,40);	//FEUILLETE
    		g2d.drawRect(291,582,150,60);	//INGENIEURIE LOGISTIQUE
    		}
    		else 
    		{
    			g2d.drawImage(image, 0, 0, image.getWidth(this), image.getHeight(this), this); //essayer de center l'image a l'ecran 
     
    		if(affichage==true)
    			{
    			g2d.drawRect(100,100,3,3);
    			}
    		}
     
     
     
    		g2d.dispose();	
    	  }
     
    	public void Afficher_alarmes()
    	{
    		//connexion à la bdd, recuperation : nombre d'alarmes et leurs coordonnées
    		int nbA=2; //nombre d'alamres enregistrer
     
    		/* 
    		coord[i][0]; abscisse
    		coord[i][1]; ordonnée
    		*/
     
    		coord = new int[nbA][2];
    		coord[0][0]=100;
    		coord[0][1]=100;
     
    		coord[1][0]=20;
    		coord[1][1]=15;
     
    		affichage = true;
     
    	}
     
    	public void mouseEntered(MouseEvent e) {
     
    	   }
    	public void mouseClicked(MouseEvent e)
    	{
    		 x = e.getX();
    	     y = e.getY();	     
     
    //encadrement de la zone de siege sgsf de coordonnées (x=90,y=310,l=150,h=60)
    	     if((x>90&&x<90+150)&&(y>310)&&(y<310+60)) 
    	   {
    		   image=getToolkit().getImage("siege.jpg");
    		   System.out.println(x+" "+y);   
    		   first=1;
    	   }
    //	   encadrement de la zone de siege locaux divers
    	     if((x>215&&x<215+120)&&(y>390)&&(y<390+45)) 
    	   {
    		   image=getToolkit().getImage("7achats.jpg");
    		   System.out.println(x+" "+y);   
    		   first=1;
    	   }
    	     repaint();
    	     repere.setText("x = "+x+" ; y = "+y);    
    	}
     
     
    }

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    318
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 318
    Points : 99
    Points
    99
    Par défaut
    en fait il dessine le rectangle derriere l'image !
    mais comment faire ?

  12. #12
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 504
    Points : 288
    Points
    288
    Par défaut
    ok deja pourquoi tu a pris paint et pas paintComponent ?
    es tu sûr que la taille de ton panel plan est assez grande pour afficher ton point ?
    ce que je te propose c'est de faire une bordure a ton panel, comme ca tu verra si il est bien inséré dans ta JFrame.
    rajoute dans son constructeur cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
          this.setBorder(BorderFactory.createLineBorder(Color.RED));

  13. #13
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 504
    Points : 288
    Points
    288
    Par défaut
    comment tu sais que c'est derriere l'image ?

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    318
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 318
    Points : 99
    Points
    99
    Par défaut
    je l'ai su en afficher une autre image plus petite
    mon probleme est reglée , j'ai juste mis mon if(affichage==true) à la fin de ma methode paint.

  15. #15
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    318
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 318
    Points : 99
    Points
    99
    Par défaut
    Question balèze maintenant :

    j'ai 3 classes : Programme(Jframe), Plan(JPanel) et Legende(JPanel).

    Programme crée Legende qui crée Plan.

    Je peux accéder alors depuis Legende à mes methodes Plan.

    Pour un soucis d'esthétisme , je voudrais maintenant afficher dans la classe Legende des informations quand on clique sur le Plan.
    Il faut donc que depuis ma classe Plan , je puisse utiliser un objet de Legende. Z'avez compris le problème ? Legende est la classe mère de Plan :s

  16. #16
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 504
    Points : 288
    Points
    288
    Par défaut
    juste une question pourquoi c'est légende qui crée le plan ?
    pourquoi ce n'est pas ta frame qui crée le plan et la légende
    cela revient a faire ce qu'avait dit sinok
    comme ca ta frame connait les 2 (plan et legende)
    au constructeur de ton plan tu lui passe ta frame et pareil pour legende.

    donc quand l'un ou l'autre veut agir sur l'autre il demande a la frame

    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
     
    class MyFrame extends JFrame {
      Plan plan;
      Legend leg;
      public MyFrame () {
        plan = new Plan(this);
        leg = new Legende(this);
      }
     
      public Legend getLegend() {
        return leg;
      }
     
      public Plan getPlan() {
        return plan;
      }
    }

  17. #17
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    318
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 318
    Points : 99
    Points
    99
    Par défaut
    Wooow merci lilou

  18. #18
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    318
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 318
    Points : 99
    Points
    99
    Par défaut
    je ne comprends pas :
    public Legend getLegend() {
    return leg;
    }

    public Plan getPlan() {
    return plan;
    }

  19. #19
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 504
    Points : 288
    Points
    288
    Par défaut
    ce sont des accesseur au attributs, grace a eux tu peux accéder à ton plan et a ta legende

    par exemple dans ta classe Legende, tu connaitra le JFrame, donc tu peux faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    myFrame.getPlan().doActionOnPlan();
    et réciproquement de ton plan tu pourras accéder à ta classe légende en passant par ta JFrame.

Discussions similaires

  1. Réponses: 7
    Dernier message: 08/02/2010, 10h51
  2. [debutant] Actualiser une JFrame et ses JPanel
    Par jerem721 dans le forum Agents de placement/Fenêtres
    Réponses: 2
    Dernier message: 27/02/2008, 11h22
  3. JFrame contenant un Jpanel et une scrollbar
    Par babarpapa dans le forum Agents de placement/Fenêtres
    Réponses: 6
    Dernier message: 18/05/2006, 16h12
  4. JPanel contenant deux JPanel definir taille de l un d eux
    Par mereyj dans le forum Agents de placement/Fenêtres
    Réponses: 2
    Dernier message: 20/06/2005, 21h40
  5. transmettre evenement d'une JFrame a un JPanel
    Par mereyj dans le forum Agents de placement/Fenêtres
    Réponses: 2
    Dernier message: 18/06/2005, 18h52

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