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

AWT/Swing Java Discussion :

Référence conteneur dans classe inférieur


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Etudiant en alternance Licence dev Web/mobile
    Inscrit en
    Mars 2015
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Etudiant en alternance Licence dev Web/mobile

    Informations forums :
    Inscription : Mars 2015
    Messages : 26
    Par défaut Référence conteneur dans classe inférieur
    Bonjour le forum,

    Je vais essayer d'exposer ma question simplement pour ne ps avoir a coller ici tout mon immonde code.
    Pour faire simple, j'ai une class fenetre héritant de JFrame, dans laquelle j'instancie un JTabbedPane avec 4 Onglets.
    Pour mes onglets, j'instancie des class héritant de JPanel.
    Dans un de ces JPanels j'utilise une JTable, dans laquelle j'intègre des boutons a l'aide de TableCellRenderer et TableCellEditor.
    En résumé:
    JFrame
    _JTabbedPane
    __JPanel
    ___JTable
    ____JButtonEditor
    _____ActionListenner des boutons

    Question:
    Comment récupérer une référence à la JFrame principale dans l'action listener d'un bouton se trouvant dans la JTable?
    Par exemple pour actualiser l'affichage de la JTable si je supprime une ligne, car la JTable est remplie par une fonction récupérant une base de données.

    Voilà, si vraiment c'est incompréhensible j'essaierai d'apporter des précisions et sinon je collerai du code mais ce serait un peu lourd...

    Merci d'avance

  2. #2
    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
    Si tu veux juste récupérer la JFrame, à partir du JTable tu récupère le parent, le parent du parent etc jusque la JFrame.

    Mais le plus propre ça reste de donner cette information au bouton quand tu l'instancie

  3. #3
    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 : 55
    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,

    Si la solution de fournir l'instance de JFrame au composant qui en a besoin reste la plus propre, au lieu de remonter la liste de parent de parent..., il y a SwingUtilities.getWindowAncestor(composant) qui donne directement l'instance de JFrame.
    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.

  4. #4
    Membre averti
    Homme Profil pro
    Etudiant en alternance Licence dev Web/mobile
    Inscrit en
    Mars 2015
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Etudiant en alternance Licence dev Web/mobile

    Informations forums :
    Inscription : Mars 2015
    Messages : 26
    Par défaut
    Bonjour, et merci pour votre aide !
    Je rencontre un autre problème:
    Comme je l'ai dis, j'utilise ButtonEditor, et ButtonRenderer, pour afficher et utiliser des boutons dans une JTable.
    Mais du coup, dans mon buttonEditor, quand j'essai d'utiliser vos méthodes, j'ai droit à un "cette méthode n'est pas valable pour le type buttonEditor"...
    Seulement, j'ai l'impression que c'est le seul endroit ou je peux agir sur le bouton, il y a les actionslister, performed etc..

    Mais je n'arrive pas a trouver l'endroit pour utiliser getParent() et enfin récupérer les conteneurs parents !


    Je suis tout ouïe, je continue à creuser en attendant

    EDIT:

    JPanel jp = (JPanel)button.getRootPane().getParent();
    CardLayout cl = jp.getLayout();


    J'en suis là, j'essayais d'appeler getParent() sur this, mais en y réfléchissant c'est normal que ca ne fonctionnait pas.
    Donc je l'appelle sur l'attribut button de la class buttonEditor.
    Suis-je sur la bonne voie?

    J'aimerai aussi faire un next() sur le cardLayout ou se trouve ma JTable, mais le getLayout ne fonctionnant pas, je sèche ?
    Il faut que je récupère le layout du jpanel que je récupère à la ligne du dessus

  5. #5
    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 : 55
    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
    Les instances de TableCellEditor et de TableCellRender ne sont pas des composants SWING, mais des fabriques de composants : il faut donc intervenir sur le composant produit par ces fabriques. Mais le composant produit par le renderer n'est pas un composant qui appartient à l'arborescence de composants : le rendu est affiché un peu comme une image : donc ça ne fonctionnera pas. Le composant produit par l'éditeur lui n'est dans la JTable uniquement lorsque l'édition est active dans le composant.

    Va chercher la fenêtre parente de la JTable (passer l'instance de JTable en argument de la méthode SwingUtilities.getWindowAncestor(composant)), surtout qu'on l'a dans les paramètres des méthodes de fabrication du renderer et de l'éditeur, ça reviendra bien à obtenir la fenêtre dans laquelle le renderer ou l'éditor se trouve. Pour un éditeur de type bouton, ça devrait fonctionner avec l'instance de bouton, tant qu'on appelle pas stopCellEditing ou cancelCellEditing.

    A noter, que pour rafraichir la JTable, en cas de suppression de ligne, il n'est pas nécessaire de passer par la frame (sauf si tu veux absolument exécuter à nouveau la requête de remplissage) : il suffit de supprimer la ligne dans le modèle. Pour un modèle que tu auras implémenté toi-même, il suffira que la méthode de suppression invoque la bonne méthode d'envoi d'évenement de modification de modèle : regarde les méthodes dont le nom commence par fire dans DefaultTableModel.

    EDIT : je vois que tu as modifié ton message

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    JPanel jp = (JPanel)button.getRootPane().getParent();
    CardLayout cl = jp.getLayout();
    Ne passe pas par le rootpane : à priori, le rootpane est celui de la fenêtre. Utiliser directement getParent() : le parent ne sera pas un JPanel, mais une JTable, mais le parent de la JTable est probablement celui que tu veux. Par contre, il faudrait caster getLayout() en CardLayout. Dans un cas comme ça, il est tout de même bien mieux de passer la référence de l'objet à manipuler au TableCellEditor : ça évite de faire des getParent().getParent() ou des casts qui ne pourraent ne plus fonctionner au moindre changement de ton ui.
    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.

  6. #6
    Membre averti
    Homme Profil pro
    Etudiant en alternance Licence dev Web/mobile
    Inscrit en
    Mars 2015
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Etudiant en alternance Licence dev Web/mobile

    Informations forums :
    Inscription : Mars 2015
    Messages : 26
    Par défaut
    Bonjour Joel, et merci pour ton aide !

    J'ai réussi à récupérer ma frame principale avec la SwingUtilities, enfin je pense.
    J'ai fais un getClass sur l'objet retourné et c'est bien une class fenetre !
    Cependant, j'ai fais un revalidate() + repaint() dessus, et rien n'a changé, je suis toujours obligé de fermer l'appli pour voir le résultat de la suppression de ligne.
    Si tu as la solution la dessus ca m'évitera de partir sur la methode de suppression de ligne JTable, car mon collègue à utiliser une AbstractTableModel et non DefautTableModel..

Discussions similaires

  1. Réponses: 3
    Dernier message: 23/03/2015, 11h12
  2. Références croisées dans les classes
    Par Sve@r dans le forum Général Python
    Réponses: 8
    Dernier message: 13/01/2012, 18h02
  3. Réponses: 4
    Dernier message: 25/06/2009, 11h40
  4. Visibilité de methodes dans Classe de Class
    Par Math75 dans le forum C++
    Réponses: 9
    Dernier message: 28/09/2004, 12h48
  5. problème de références _ptr dans une map STL
    Par Mr_Tyu dans le forum CORBA
    Réponses: 1
    Dernier message: 10/08/2004, 10h39

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