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 :

[popup] ne pas avoir de 'cache' avec PopupFactory


Sujet :

AWT/Swing Java

  1. #1
    Invité
    Invité(e)
    Par défaut [popup] ne pas avoir de 'cache' avec PopupFactory
    Bonjour,

    Pour afficher plusieurs composants, j'utilise un popup qui s'affiche lorsque l'on actionne un JButton et se masque lorsque l'on re-actionne le JButton.

    Ce 'système' peut-être présent n fois dans un JScrollPane.

    Mon problème est que PopUpFactory met en 'cache' le popup.
    Or pour chaque ligne le contenu du popup doit-être indépendant.. Mais le popup ne gére pas cela correctement :

    Le premier popup contenait la même chose que le second mais une fois que j'ai affiché le second et réaffiche le premier, le résultat n'est pas celui attendu..

    Voici le code d'affichage du popup.
    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
     
    ...
    addActionListener(new ActionListener(){
                public void actionPerformed(java.awt.event.ActionEvent e) {
                    if ( popup == null ) {
                        popup = getPopup();
                        popup.show();
                        System.out.println("how popup " + popup );
                    } else {
                        System.out.println("hide popup " + popup);
                        popup.hide();
                        popup= null;
                    }
                }
            }); 
    ....
     
     private Popup getPopup(){
            int x,y;
     
            x = (int)btn.getLocationOnScreen().getX()+5;
            y = (int)btn.getLocationOnScreen().getY()+btn.getHeight();
     
            PopupFactory factory = PopupFactory.getSharedInstance();
            popup = factory.getPopup(btn,pnl,x,y);
     
            return popup;
        }
    Quelqu'un à une idée ?

  2. #2
    Membre Expert
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Par défaut
    Bonjour,

    je me souviens avoir utilisé un JPopupMenu, et ce sans passer par la PopupFactory (avec un MouseListener). Je n'ai pas eu de problèmes de ce type. Pour tout te dire, je ne savais même pas que cette classe existait (PopupFactory).
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Haaa oui c'est juste il y à la méthode public Component add(Component comp)

    Mais le résultat est toujours le même. Le second affiche bien son contenu alors que le permier ne l'affiche plus complètement.

    Ca ne viens donc surement pas du Popup en lui-même..

    Voici mon code :
    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
     
    addActionListener(new ActionListener(){
                public void actionPerformed(java.awt.event.ActionEvent e) {
                    System.out.println("show/hide popup for content : " + pnl );
                    if ( popup == null ) {
                        //popup = getPopup();
                        //popup.show();
                        pp = new JPopupMenu();
                        pp.add(pnl);
                        pp.show(btn, (int)btn.getLocationOnScreen().getX()+5, (int)btn.getLocationOnScreen().getY()+btn.getHeight() );
                        //System.out.println("show popup " + pp );
                    } else {
                        //System.out.println("hide popup " + pp);
                        pp.setVisible(false);
                        //popup.hide();
                        //popup= null;
                    }
                }
            });
    et le résultat aprés un click sur le premier ensuite sur le second et encore sur le premier.

    show/hide popup for content :
    javax.swing.JScrollPane[,0,0,0x0,invalid,layout=javax.swing.ScrollPaneLayout$UIResource,alignmentX=0.0,alignmentY=0.0,border=javax.swing.border.LineBorder@6214f5,flags=16777544,maximumSize=,minimumSize=,preferredSize=,columnHeader=,horizontalScrollBar=javax.swing.JScrollPane$ScrollBar[,0,0,0x0,invalid,layout=com.sun.java.swing.plaf.windows.WindowsScrollBarUI,alignmentX=0.0,alignmentY=0.0,border=,flags=4194632,maximumSize=,minimumSize=,preferredSize=,blockIncrement=10,orientation=HORIZONTAL,unitIncrement=1],horizontalScrollBarPolicy=HORIZONTAL_SCROLLBAR_AS_NEEDED,lowerLeft=,lowerRight=,rowHeader=,upperLeft=,upperRight=,verticalScrollBar=javax.swing.JScrollPane$ScrollBar[,0,0,0x0,invalid,layout=com.sun.java.swing.plaf.windows.WindowsScrollBarUI,alignmentX=0.0,alignmentY=0.0,border=,flags=4194632,maximumSize=,minimumSize=,preferredSize=,blockIncrement=10,orientation=VERTICAL,unitIncrement=1],verticalScrollBarPolicy=VERTICAL_SCROLLBAR_AS_NEEDED,viewport=javax.swing.JViewport[,0,0,0x0,invalid,layout=javax.swing.ViewportLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=25165832,maximumSize=,minimumSize=,preferredSize=,isViewSizeSet=false,lastPaintPosition=,scrollUnderway=false],viewportBorder=]
    show/hide popup for content : javax.swing.JScrollPane[,0,0,0x0,invalid,layout=javax.swing.ScrollPaneLayout$UIResource,alignmentX=0.0,alignmentY=0.0,border=javax.swing.border.LineBorder@1f6f27b,flags=16777544,maximumSize=,minimumSize=,preferredSize=,columnHeader=,horizontalScrollBar=javax.swing.JScrollPane$ScrollBar[,0,0,0x0,invalid,layout=com.sun.java.swing.plaf.windows.WindowsScrollBarUI,alignmentX=0.0,alignmentY=0.0,border=,flags=4194632,maximumSize=,minimumSize=,preferredSize=,blockIncrement=10,orientation=HORIZONTAL,unitIncrement=1],horizontalScrollBarPolicy=HORIZONTAL_SCROLLBAR_AS_NEEDED,lowerLeft=,lowerRight=,rowHeader=,upperLeft=,upperRight=,verticalScrollBar=javax.swing.JScrollPane$ScrollBar[,0,0,0x0,invalid,layout=com.sun.java.swing.plaf.windows.WindowsScrollBarUI,alignmentX=0.0,alignmentY=0.0,border=,flags=4194632,maximumSize=,minimumSize=,preferredSize=,blockIncrement=10,orientation=VERTICAL,unitIncrement=1],verticalScrollBarPolicy=VERTICAL_SCROLLBAR_AS_NEEDED,viewport=javax.swing.JViewport[,0,0,0x0,invalid,layout=javax.swing.ViewportLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=25165832,maximumSize=,minimumSize=,preferredSize=,isViewSizeSet=false,lastPaintPosition=,scrollUnderway=false],viewportBorder=]
    show/hide popup for content : javax.swing.JScrollPane[,1,2,156x42,invalid,layout=javax.swing.ScrollPaneLayout$UIResource,alignmentX=0.0,alignmentY=0.0,border=javax.swing.border.LineBorder@6214f5,flags=16777544,maximumSize=,minimumSize=,preferredSize=,columnHeader=,horizontalScrollBar=javax.swing.JScrollPane$ScrollBar[,0,0,0x0,hidden,layout=com.sun.java.swing.plaf.windows.WindowsScrollBarUI,alignmentX=0.0,alignmentY=0.0,border=,flags=4194632,maximumSize=,minimumSize=,preferredSize=,blockIncrement=10,orientation=HORIZONTAL,unitIncrement=1],horizontalScrollBarPolicy=HORIZONTAL_SCROLLBAR_AS_NEEDED,lowerLeft=,lowerRight=,rowHeader=,upperLeft=,upperRight=,verticalScrollBar=javax.swing.JScrollPane$ScrollBar[,0,0,0x0,hidden,layout=com.sun.java.swing.plaf.windows.WindowsScrollBarUI,alignmentX=0.0,alignmentY=0.0,border=,flags=4194632,maximumSize=,minimumSize=,preferredSize=,blockIncrement=10,orientation=VERTICAL,unitIncrement=1],verticalScrollBarPolicy=VERTICAL_SCROLLBAR_AS_NEEDED,viewport=javax.swing.JViewport[,1,1,154x40,invalid,layout=javax.swing.ViewportLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=25165832,maximumSize=,minimumSize=,preferredSize=,isViewSizeSet=true,lastPaintPosition=java.awt.Point[x=0,y=0],scrollUnderway=false],viewportBorder=]
    Dernière modification par Invité ; 25/10/2006 à 15h29.

  4. #4
    Membre Expert
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Par défaut
    Je te conseille d'aller jeter un oeil au tutoriel de Sun. Il n'y a pas besoin d'ordonner au JPopupMenu se se cacher.

    En général, je construis le JPopupMenu dans le constructeur du composant qui le contrôle, et je me contente de faire un show au moment voulu. Il me semble que ça suffit.

    Dans ton code, tu testes la valeur de la variable popup, mais tu assignes une valeur à pp. Ca ne me dit rien de bon.
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par xavlours
    Je te conseille d'aller jeter un oeil au tutoriel de Sun.
    Oui c'est ce que je vais faire.

    Citation Envoyé par xavlours
    Dans ton code, tu testes la valeur de la variable popup, mais tu assignes une valeur à pp. Ca ne me dit rien de bon.
    Ha oui, en effet ça risque de poser des problèmes.
    Enfin bon c'est juste un code modifié encore et encore..

    Merci por ton conseil, je vais tester cela aussi..

  6. #6
    Invité
    Invité(e)
    Par défaut
    Voilà j'ai maintenant ce code sur le JButton.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    this.btnShow = new JButton(Titles.PARAM_LIGNE_BTNVIEWALL);
            this.btnShow.setToolTipText(Titles.PARAM_LIGNE_BTNVIEWALL_TOOLTIP);
            try {
                this.btnShow.setIcon( new ImageIcon(getClass().getClassLoader().getResource("images/popup.png")) );
            } catch ( NullPointerException e ) {}
            this.btnShow.addActionListener(new ActionListener(){
               public void actionPerformed(ActionEvent e) {
                   JPopupMenu pp = new JPopupMenu();
                   pp.add(popupContent);
                   pp.show((JButton)e.getSource(), btnShow.getX(), btnShow.getY());
               } 
            });
    Mais le résultat est toujours le même...

  7. #7
    Membre Expert
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Par défaut
    Bon, je viens de faire des tests, et en fait, l'idéal, c'est de contruire le JPopupMenu dans le constructeur (comme dans le tutoriel), et de simplement l'afficher et le cacher (en fait il faut le faire) dans l'actionPerformed.

    Si tu construis le JPopupMenu dans le actionPerformed, tu risques de te retrouver avec plusieurs instances, qui vont se voler l'unique instance du contenu popupContent, et c'est la galère.
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

  8. #8
    Invité
    Invité(e)
    Par défaut
    Le problème est que je ne sais pas à l'avance ce qui sera dans le popup. Je ne le sais qu'après que l'utilisateur ai sélectionné quelque chose dans une JComboBox. Et donc que ma ligne est déjà créée donc que je suis déjà passé dans le constructeur.

    Ce que j'ai fait, c'est de créer le Popup avec son JPanel de contenu (sans contenu) dans le constructeur de l'action qui sera réalisée lorsque l'utilisateur sélectionner quelque chose dans la JComboBox mais le résultat reste le même...

    Voici le code de l'action affectée à la JComboBox
    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
     
    public class ParamShowComponentsAction extends AbstractAction {
     
        private Item item; // Item étend ArrayList
        private JPanel panel;
        private LigneParametre ligne;
        private JButton btnShow;
        private JPanel popupContent;
        private JPopupMenu popup;
     
        public ParamShowComponentsAction( LigneParametre ligne) {
            this.ligne = ligne;
     
            panel = this.ligne.getPnlValue(); 
            popupContent = new JPanel(new GridLayout(2,10));
            popup = new JPopupMenu();
            popup.add( popupContent );
     
            btnShow = new JButton(Titles.PARAM_LIGNE_BTNVIEWALL);
            btnShow.setToolTipText(Titles.PARAM_LIGNE_BTNVIEWALL_TOOLTIP);
            try {
                btnShow.setIcon( new ImageIcon(getClass().getClassLoader().getResource("images/popup.png")) );
            } catch ( NullPointerException e ) {}
     
            btnShow.addActionListener(new ActionListener(){
               public void actionPerformed(ActionEvent e) {
                   popup.show((JButton)e.getSource(), btnShow.getX()-btnShow.getWidth(), btnShow.getY());
               } 
            });
        }
     
        // TODO Remplacer le texte "Afficher l'entièreté.. " par un aperçu du résultat
        public void actionPerformed(ActionEvent e) {
            item = (Item) ((JComboBox) e.getSource()).getSelectedItem();
            panel.setLayout( new BorderLayout(5,0));
            panel.removeAll();
            if ( item.size()<=1 ) {
                panel.add( new JLabel( item.getFirstComponent().toString()), BorderLayout.WEST);
                panel.add( item.getFirstComponent().getVisualInstance(), BorderLayout.CENTER );
                ligne.setUnit( item.getFirstComponent().getUnit() );
            } else {
                panel.add( new JLabel("Afficher l'entièreté du paramètre"), BorderLayout.CENTER);
                panel.add( btnShow, BorderLayout.EAST);
     
                popupContent.removeAll();
                for (Iterator it = item.iterator(); it.hasNext();) {
                    ParametreComponent component = (ParametreComponent) it.next();
                    popupContent.add( new JLabel(component.toString()) );
                    popupContent.add( component.getVisualInstance() );  // recupère un JComponent
                    popupContent.validate();
                }
            }
            panel.validate();
            panel.repaint();
     
        }

  9. #9
    Membre Expert
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Par défaut
    Avec quelle version de Java programmes-tu ? Je vois que tu utilises pas pal de méthodes deprecated ...

    Enfin, normalement, ton code devrait marcher, mais je ferais bien quelques modifications :
    - plutot que popupContent.validate(), tu peux appeler popup.pack(), c'est plus complet (mais je sais pas si ça change vraiment quelque chose.

    - plutôt que popup.show() aui est deprecated en 1.5, j'utilise popup.setLocation(...) puis popup.setVisible(true).

    Enfin, dans l'action du bouton, il faut cacher la popup ! Sinon, elle ne fait que passer derrière la fenêtre principale. Il faut donc faire un test du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if(!popup.isVisible())
      popup.setLocation(...);
    popup.setVisible(!popup.isVisible());
    Avec ce code, il faudra cliquer sur le bouton pour cacher la popup.
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

  10. #10
    Invité
    Invité(e)
    Par défaut
    He bien d'après eclipse j'utilise la 1.50_06.

    Citation Envoyé par xavlours
    Enfin, dans l'action du bouton, il faut cacher la popup ! Sinon, elle ne fait que passer derrière la fenêtre principale. Il faut donc faire un test du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if(!popup.isVisible())
      popup.setLocation(...);
    popup.setVisible(!popup.isVisible());
    Avec ce code, il faudra cliquer sur le bouton pour cacher la popup.
    J'ai essayé un code comme ça mais le popup disparait et reviens aussi vite lorsque je clique sur le bouton...
    J'ai fais ceci :
    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
     
     btnShow.addActionListener(new ActionListener(){
               public void actionPerformed(ActionEvent e) {
     
                   System.out.println("avant : " + popup.isVisible());
     
                   if(popup.isVisible()) {
                       System.out.println("\t masque");
                       popup.setVisible(false);
                   } else {
                       System.out.println("\t affiche");
                       popup.setLocation( btnShow.getLocationOnScreen().x + btnShow.getWidth(), btnShow.getLocationOnScreen().y );
                       popup.pack();
                       popup.setVisible(true);
                   }
                   //popup.setVisible(!popup.isVisible());
     
                   System.out.println("apres : " + popup.isVisible() + "\n");
     
               } 
            });
    et en fessant un clic pour afficher et un clic pour normalement masquer,ça me donne :
    avant : false
    affiche
    apres : true

    avant : false
    affiche
    apres : true

  11. #11
    Membre Expert
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Par défaut
    Voila qui est étrange ... Chez moi ça donne ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    avant : false
         affiche
    apres : true
     
    avant : true
         masque
    apres : false
    Est-ce que tu peux tester le programme en pièce jointe, on sait jamais ? Moi je suis sur Mac OS X Eclipse jdk 1.5_06.
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

Discussions similaires

  1. [AC-2007] Ne pas avoir de doublons dans une requête avec beaucoup de OU
    Par GroFlo dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 14/02/2012, 15h52
  2. Vider le cache pour ne pas avoir de champs remplis dans un formulaire.
    Par xess91 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 03/06/2010, 11h43
  3. Réponses: 0
    Dernier message: 02/06/2008, 13h30
  4. Ne pas utiliser le cache avec open
    Par coockie_jr dans le forum C++
    Réponses: 6
    Dernier message: 30/05/2008, 17h51
  5. [eclipse][plugin] Comment avoir une fenêtre avec focus
    Par relivio dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 07/04/2004, 15h54

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