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 :

Question à propos des méthodes getAccessibleContext, getAccessibleChild et getInvoker


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 128
    Par défaut Question à propos des méthodes getAccessibleContext, getAccessibleChild et getInvoker
    Bonjour,

    J'aimerais savoir, dans le cas où l'on a un JComboBox "menu", s'il est possible que getInvoker renvoie un pointeur NULL après cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    menu.getAccessibleContext().getAccessibleChild(0).getInvoker();
    (En tenant compte que l'on vérifie que le child en question est bien un instanceof BasicComboPopup)
    Si oui, pourquoi et comment ?

    Moi je dirais que oui et cela viendrait du fait que le Child est créé et non pas récupéré, donc qu'il n'y a pas, fatalement, de component derrière.

    Mais si c'est effectivement le cas, cela impliquerait que la création d'un JComboBox ne crée pas de child ou que celui-ci pourrait être supprimé. Cela me paraît cependant peu vraisemblable.

    Voici ce qu'indique la doc des méthodes
    AccessibleContext javax.swing.JComboBox.getAccessibleContext()
    Gets the AccessibleContext associated with this JComboBox. For combo boxes, the AccessibleContext takes the form of an AccessibleJComboBox. A new AccessibleJComboBox instance is created if necessary.

    javax.accessibility.AccessibleContext.getAccessibleChild(int arg0)
    Returns the specified Accessible child of the object. The Accessible children of an Accessible object are zero-based, so the first child of an Accessible child is at index 0, the second child is at index 1, and so on.

    javax.swing.JPopupMenu.getInvoker()
    Returns the component which is the 'invoker' of this popup menu.
    Quelqu'un saurait-il m'éclairer à ce sujet ?

    Merci d'avance pour votre aide.

  2. #2
    Membre très actif
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 128
    Par défaut
    Bon, je vais faire plus simple peut être.

    Voici un lien contenant la classe BoundsPopupMenuListener.java.
    Sur ce lien, également, se trouve un fichier .jnlp afin de tester cette classe.
    Voici le lien :
    http://tips4java.wordpress.com/2010/...mbo-box-popup/

    Cette classe permet, notamment, de déplacer le popup d'un JComboBox au dessus de celui-ci et non en dessous.
    Lorsque vous exécuter le fichier .jnlp, si vous cocher "Popup Above", vous devriez observez le comportement dont je vous parle à la phrase précédente.

    Sur linux, no soucy.
    Par contre, sur mac os x, j'ai plusieurs soucis.
    En premier lieu, le popup ne s'affiche pas au dessus du JComboBox mais en dessous.
    Pour savoir d'où vient le problème, j'ai catché si une erreur se présentait. Et en effet, on a un NULL pointer quand la méthode popupAbove invoque getInvoker().
    L'objet de mon post au dessus était de savoir pourquoi ça peut arriver.
    Et pour terminer, si on fait abstraction du getInvoker() en passant directement à la méthode popupAbove le JComboBox qui s'occupe d'invoquer le popup, ça ne marche toujours pas.

    Je pense(avec très peu de certitudes) que ça doit venir de la version du jre. Sur mac os x, on a pas la jre 1.7, la version la plus récente est 1.6.0_29.
    Entre temps, il y a peut-être eu une mise à jour qui affecte négativement la classe en question

    Si vous avez une idée de comment détourner le problème ou de confirmer/infirmer mon hypothèse, vous êtes les bienvenues

    Un tout grand merci

    Edit : J'ai installé une beta du jdk 1.7 et le soucis est toujours là.

  3. #3
    Membre très actif
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 128
    Par défaut
    Ouww, j'ai quand même réussi à poser une question dont personne a encore la réponse :p Même sur le forum d'oracle ^^

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

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    As tu essayé de remplacer le par un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    getAccessibleContext().getAccessibleParent();
    comme recommandé dans un des commentaires du blog auquel tu te réfères?

  5. #5
    Membre très actif
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 128
    Par défaut
    Bien évidemment

    J'ai crée un sujet sur le forum d'oracle.
    Même sujet sur le forum oracle

    Il s'agit d'un bug, il semblerait.
    Je pense l'avoir identifier.
    Je ne sais pas comment je vais le détourner.
    Je vais ajouter une réponse sur ce forum et sur l'autres expliquant où se trouve le bug. Et plus tard dans la soirée, peut-être, comment le résoudre

  6. #6
    Membre très actif
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 128
    Par défaut
    Bonjour ou bonsoir,

    J'ai trouvé ma réponse.

    Le problème provient de la classe javax.swing.plaf.basic.BasicComboPopup.
    Les versions inculpées(sans trop de certitudes) : JRE 1.6.0_22 jusqu'à 1.7.0_3.
    Le problème est à l'origine une correction de cette classe suite à un bug.

    Le soucis en question provient donc des lignes suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        /**
         * Implementation of ComboPopup.show().
         */
        public void show() {
            comboBox.firePopupMenuWillBecomeVisible();
            setListSelection(comboBox.getSelectedIndex());
            Point location = getPopupLocation();
            show( comboBox, location.x, location.y );
        }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        // Overriden PopupMenuListener notification methods to inform combo box
        // PopupMenuListeners.
        protected void firePopupMenuWillBecomeVisible() {
            super.firePopupMenuWillBecomeVisible();
            // comboBox.firePopupMenuWillBecomeVisible() is called from BasicComboPopup.show() method
            // to let the user change the popup menu from the PopupMenuListener.popupMenuWillBecomeVisible()
        }
    Pour que le programme fonctionne, il faut revenir à l'ancienne version :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        /**
         * Implementation of ComboPopup.show().
         */
        public void show() {
            setListSelection(comboBox.getSelectedIndex());
            Point location = getPopupLocation();
            show( comboBox, location.x, location.y );
        }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        // Overriden PopupMenuListener notification methods to inform combo box
        // PopupMenuListeners.
        protected void firePopupMenuWillBecomeVisible() {
            super.firePopupMenuWillBecomeVisible();
            comboBox.firePopupMenuWillBecomeVisible();
        }
    Voici quelques petites analyses que j'ai fais sur linux :
    1] BasicComboPopup possède un mouse listener
    2] Quand un clic sur la souris est détecté, il invoque BasicComboPopup.togglePopup()
    3] La méthode togglePopup() rend le Popup visible si il ne l'est pas et inversement
    4] En l’occurrence, ici il rend visible le Popup. Pour cela, il invoque la méthode BasicComboPopup.show()
    5] La méthode show(), sans rentrer dans les détails(parce qu'ils ne me sont pas tous connus) effectue ceci : modification des variables qui concernent le JComboBox, récupération de la position du Popup associé au BasicComboPopup de la JComboBox, ajout de l'invoker au BasicComboPopup, modification des variables de position du Popup, la méthode firePopupMenuWillBecomeVisible(PopupMenuEvent e) est executé, à la fin de la méthode PopupMenuWillBecomeVisible(PopupMenuEvent e) le Popup est supprimé, on associe un nouveau Popup au BasicComboPopup.

    Sur les versions supérieures de BasicComboPopup, on commence par faire un togglePopup(), suivi du firePopupMenuWillBecomeVisible(PopupMenuEvent e), puis la même chose à partir du point 4 en haut.
    Dans ce cas précis, BasicComboPopup n'a pas d'invoker avant de rentrer dans PopupMenuWillBecomeVisible(PopupMenuEvent e) et on a le soucis expliqué au premier post.
    De plus, après PopupMenuWillBecomeVisible(PopupMenuEvent e), le Popup est supprimé et on revient au point 4. A partir de là, un nouveau Popup est créé(puisqu'il n'y en a plus) et placé sans prise en compte des variables de positionnements de l'ancien Popup. Et donc fatalement, le Popup est toujours après le JComboBox.


    Je n'ai pas encore trouver une solution sans toucher cette classe. Il y en a surement une en touchant les flags associés à PopupMenuWillBecomeVisible(PopupMenuEvent e) et en invoquant certaines méthodes. Néanmoins, vu que de ce côté là, il n'y a que très peu de méthodes publiques, je pense qu'il va falloir passer par des classes parentes. Mais ça je verrais demain.

    Sérieux, si vous avez une idée avec ce que je vous ai donné, je crierais de joies en la lisant ^^

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

Discussions similaires

  1. question à propos des containeurs
    Par bountykiller dans le forum C++
    Réponses: 4
    Dernier message: 02/10/2005, 13h21
  2. Question à propos des états
    Par rangernoir dans le forum IHM
    Réponses: 4
    Dernier message: 30/09/2005, 14h38
  3. Question à propos des compilateurs
    Par elf dans le forum Autres éditeurs
    Réponses: 4
    Dernier message: 20/07/2005, 17h00
  4. Question à propos des niveaux de transaction
    Par davy.g dans le forum Oracle
    Réponses: 3
    Dernier message: 18/01/2005, 15h31
  5. Une question à propos des thread
    Par tscoops dans le forum C++Builder
    Réponses: 4
    Dernier message: 07/11/2003, 14h03

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