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 :

Récupérer les données d'une JFrame dans un JPanel


Sujet :

Agents de placement/Fenêtres Java

  1. #1
    Futur Membre du Club
    Homme Profil pro
    etudiant
    Inscrit en
    Décembre 2016
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : etudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2016
    Messages : 3
    Par défaut Récupérer les données d'une JFrame dans un JPanel
    Bonjour,

    je code une petite appli qui doit afficher des points d'interets de ma région sur une carte avec des checkbox (musée, église etc.)

    Le soucis est que je n'arrive pas à afficher les pictogrammes : quand ma fentre se crée, j'affiche la carte seule, puis quand l'utilisateur appuie sur le bouton valider, le programme affiche les pictogrammes correspondant aux checkbox cochées, je n'arrive pas à faire différencier les deux cas.

    Après quelques test, il semblerait que le problème vienne quand je souhaite récupèrer les données stockées dans ma Jframe depuis mon Jpanel.
    Avez vous une idée du pourquoi du comment ?

    Voici mon code incriminé :


    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
    public class Panneau extends JPanel implements MouseListener {
     
        private FenetreProjet vue; //fenetre extends jframe
        private ArrayList<JCheckBox> tabCheck;
        private HashMap<String, ArrayList<PointInteret>> hmPI;
     
        @Override
        public void paintComponent(Graphics g){
            try {
                Image img = ImageIO.read(new File("./Franche-Comte.jpg"));
                g.drawImage(img,0,0,381,516,this);
                //tabCheck=vue.getCheckBox(); =====> problème ici
                boolean repaint=false;
                for (JCheckBox c : tabCheck) {
                    if (c.isSelected()==true) {
                        repaint = true;
                    }
                }
                if (repaint==true) {
                    //blablabla

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    Montre-nous un code complet. Un code partiel ne sert à rien, nous amènera à de fausses suppostions et on ne pourra pas voir ce qui ne va pas dans ce qui n'est pas présent.

    Cela dit, plusieurs choses :

    1. tu vas récupérer des checkboxes de ta fenêtre via la variable vue : elle est bien déclarée, mais on ne voit nulle part une initialisation. On ne voit même pas de constructeur avec un paramètre de type JFrame qui permettrait éventuellement à le fenêtre de passer sa référence au panel quand il le construit. L'attribut étant privé, je ne vois pas comment il est affecté, à moins que parmi ce que tu nous montres pas, il y a un mutateur.
    2. Au sujet de ces checkboxes, et de leur interaction avec l'affichage, il serait préférable de rendre indépendant le panneau de la fenêtre : plutôt que d'accèder directement aux checkboxes depuis le JPanel, surtout de sa méthode paint (traitement lourd dans l'Event Dispatch Thread), tu peux simplement avoir une liste (ou une map) en attribut de ta classe des éléments à afficher, et avoir une méthode qui permet de les activer/désactiver et qui fait simplement un repaint (lorsque c'est nécessaire)...

      Par exemple (ici j'affiche des String pour simplfier, avec une map avec des valeurs booléennes pour activer/Désactiver) :
      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
      public class Panneau extends JPanel {
       
      	private final Map<String,Boolean> displayables;
       
      	public Panneau(String...displayables) {
      		this.displayables=new LinkedHashMap<>(); // LinkedHashMap pour conserver l'ordre
      		for(String displayable : displayables) {
      			this.displayables.put(displayable, false); // à l'initialisation rien n'est affiché
      		}
      	} 
       
      	public void setDisplayed(String string, boolean selected) {
      		if ( SwingUtilities.isEventDispatchThread() ) {
      			if ( displayables.containsKey(string) ) {
      				if ( displayables.put(string, selected)!=selected ) { // on active/désactive et si ça a changé, alors on redessine
      					repaint();
      				}
      			}
      			else {
      				throw new RuntimeException(string+" doesn't exist");
      			}
      		}
      		else {
      			throw new RuntimeException("Must be invoked on Event Dispatch Thread");
      		}
      	}
       
      	@Override
      	protected void paintComponent(Graphics g) {
      		super.paintComponent(g);
       
      		int y=20;
      		for(Map.Entry<String, Boolean> displayable : displayables.entrySet()) { // on parcourt l'ensemble des trucs à afficher
      			if ( displayable.getValue() ) { // si c'est activé
      				g.drawString(displayable.getKey(), 0, y); // on dessine
      				y+=20;
      			}
      		}
       
      	}
       
      	public static void main(String[] args) {
       
      			JFrame frame = new JFrame();
      			frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       
      			String[] strings = {"Machin","Truc","Bidule"};
       
      			Panneau panneau = new Panneau(strings);
      			frame.add(panneau);
       
      			JPanel checkboxPanel = new JPanel();
      			for(String string : strings) {
      				JCheckBox box = new JCheckBox(string);
      				box.addActionListener(e-> panneau.setDisplayed(string, box.isSelected()));
      				checkboxPanel.add(box);
      			}
      			frame.add(checkboxPanel, BorderLayout.SOUTH);
       
      			frame.setSize(300, 300);
      			frame.setLocationRelativeTo(null);
      			frame.setVisible(true);
       
       
      	}
       
      }

    3. ne charge pas l'image dans la méthode paintComponent. Le chargement d'un fichier image depuis le disque est une action lourde (cpu/io) et une action lourde dans le thread graphique est toujours gênante (par exemple, si ton disque est occupé lors du redessin de ta fenêtre, tu vas avoir un bloquage de ton UI, si tenue soit-elle, mais désagréable pour l'utilisateur.
      Par exemple, tu peux charger l'image à la construction du panel, la stocker dans une variable :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      public class Panneau extends JPanel implements MouseListener {
       
          private final Image img; 
       
          public Panneau() throw IOException {
              img= ImageIO.read(new File("./Franche-Comte.jpg"));
          }
       
          @Override
          protected void paintComponent(Graphics g){  
                  g.drawImage(img,0,0,381,516,this);
          }
    4. Tu devrais envisager de gérer tes images comme ressources internes plutôt que comme fichiers externes, pour te simplifier le déploiement d'une part, et pour éviter qu'on modifie les images de ton application facilement (à moins que c'est ce que tu veux permettre). Il te suffit te créer un dossier dans ton dossier de sources, par exemple appelons-le images, mettre les fichiers jpg dedans, et ensuite tu peux charger les images comme ça :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      public class Panneau extends JPanel implements MouseListener {
       
          private final Image img; 
       
          public Panneau() {
              img= new imageIcon(Panneau.class.getResource("/images/Franche-Comte.jpg"))).getImage();
          }
       
          @Override
          protected void paintComponent(Graphics g){  
                  g.drawImage(img,0,0,381,516,this);
          }
    5. Accessoirement la méthode paintComponent est censée est protected, pourquoi la promouvoir public ? Toujours éviter aussi de supprimer le comportement normal (l'appel du super) pour conserver la gestion du dessin du fond
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    etudiant
    Inscrit en
    Décembre 2016
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : etudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2016
    Messages : 3
    Par défaut
    Salut joel.drigo, merci beaucoup pour tes conseils, enfait l'erreur était toute bête... j'avais oublier de déclarer mon constructeur
    J'ai un peu honte de ne pas y avoir penser tout de suite mais bon, l'erreur est réparée et c'est ce qui compte.

    En tout cas merci encore pour ton message très intéressant, j'ai appris pas mal de chose que je ne connaissais pas

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Joomla!] Récupérer les données d'une table dans un article Joomla
    Par labartho dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 0
    Dernier message: 02/10/2012, 18h49
  2. Récupérer les données d'une liste dans une autre liste
    Par benoit knk dans le forum SharePoint
    Réponses: 2
    Dernier message: 23/05/2008, 16h10
  3. Réponses: 1
    Dernier message: 25/04/2008, 16h17
  4. Récupérer les données d'une liste dans un $_POST
    Par Sangdrax1604 dans le forum Langage
    Réponses: 4
    Dernier message: 19/10/2006, 10h55
  5. Réponses: 6
    Dernier message: 27/09/2006, 20h27

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