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

Interfaces Graphiques en Java Discussion :

PopupFactory de fou!


Sujet :

Interfaces Graphiques en Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Janvier 2011
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 24
    Par défaut PopupFactory de fou!
    bonsoir,

    Je cherche a afficher un menu que j'ai créé moi même à l'aide du PopUpFactory. je n'est pas de problème pour faire ce que je veux, à savoir l'utilisation des classes Popup et PopupFactory avec transparence.

    Le problème est que le remplacement du popUpFactory par un nouveau que je crée moi même, ben tout modifie le PopupFactory du SDK java. c'est à dire que tous les menus popup de mon appli Bug, même les composants de base de java comme JComboBox (impossible de sélectionner un autre Item que celui sélectionné par défaut).

    Voici le code des deux classes 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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
    import com.sun.awt.AWTUtilities;
    import java.awt.BorderLayout;
    import java.awt.Component;
    import javax.swing.JToolTip;
    import javax.swing.JWindow;
    import javax.swing.Popup;
     
    class TranslucentPopup extends Popup {
     
        private final JWindow popupWindow;
     
        public TranslucentPopup(Component owner, Component contents, int x, int y) {
            // create a new heavyweight window
            this.popupWindow = new JWindow();
            // mark the popup with partial opacity
            AWTUtilities.setWindowOpacity(popupWindow,
                    (contents instanceof JToolTip) ? 0.0f : 1.0f);
            // determine the popup location
            popupWindow.setLocation(x, y);
            // add the contents to the popup
            popupWindow.getContentPane().add(contents, BorderLayout.CENTER);
            contents.invalidate();
        }
     
        @Override
        public void show() {
            this.popupWindow.setVisible(true);
            this.popupWindow.pack();
            // mark the window as non-opaque, so that the
            // shadow border pixels take on the per-pixel
            // translucency
            AWTUtilities.setWindowOpaque(this.popupWindow, false);
        }
     
        @Override
        public void hide() {
            this.popupWindow.setVisible(false);
            this.popupWindow.removeAll();
            this.popupWindow.dispose();
        }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    import java.awt.Component;
    import javax.swing.Popup;
    import javax.swing.PopupFactory;
     
    public class TranslucentPopupFactory extends PopupFactory {
     
        @Override
        public Popup getPopup(Component owner, Component contents, int x, int y) throws IllegalArgumentException {
            return new TranslucentPopup(owner, contents, x, y);
        }
    }
    Dans le constructeur de mon composant du menu, j'ai fait ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
            PopupFactory.setSharedInstance(new TranslucentPopupFactory());
    Ensuite pour afficher mon Popup j'utilise:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    newPopup = PopupFactory.getSharedInstance().getPopup(this.getRootPane(), this, this.getX(), this.getY());
    newPopup.show();
    et pour le cacher:

    Mon menu fonctionne parfaitement avec ce que j'ai montré là dessus..
    Si vous avais une explication, merci d'avance

  2. #2
    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
    Ton problème tient dans cette ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PopupFactory.setSharedInstance(new TranslucentPopupFactory());
    En effet, la SharedInstance est utilisée par toute les classes Swing utilisant des popup (d'où le mot Shared indiqué dans le nom). Donc forcément si tu la remplace par une instance de popup transparente, tout composant appelant cette méthode statique va se retrouver avec une popup transparente. De fait il te faut créer ta propre factory de ton coté et surtout pas la partager via un setSharedInstance.

    En plus ce n'est vraiment pas bien dur de faire un JPopupMenu transparent. Le code suivant suffit amplement. Toi tu essaie de faire ça avec une usine à gaz pour pas grand chose.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    popup.setOpaque(false);
    // the following line must be executed only when
    // the poup menu is shown
    popup.getParent().setOpaque(false);
    Sans même parler de la solution glasspane.

  3. #3
    Membre averti
    Inscrit en
    Janvier 2011
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 24
    Par défaut
    Une question! Dans le code que tu m'a proposé pour rendre le JPopupMenu transparent, la variable popup est de type "JPopupMenu"?
    Car si c'est le cas, je n'est pas accès à setOpaque sur le getParent!

    pour le GlassPane, j'ai essayé mais j'ai des problèmes avec le Layout et le positionnement de mon composant en fonction du click. C'est très bien pour afficher un splashScreen mais pour ce que je veux faire, je trouve que ce n'est pas adapté (après, je me rend compte de plus en pus que je connais pas Java très bien et peu être je me trompe).


    J'expose un peu plus mon problème, pour mieux vous guider:

    Au départ j'avais un PieMenu construit complétement à l'aide de la JLayeredPane. une fois terminé, je me suis rendu compte que mon PieMenu est complètement en arrière plan par rapport aux autres composants de ma fenêtre.
    A partir de là, j'ai transformé mon de la classe principale de mon PieMenu en .

    dans le constructeur j'ai rajouter:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    this.setayout(null);
    this.setBorder(null);
    this.setOpaque(false);
    ensuite, après chaque j'essaye de rajouter
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this.getParent().setOpaque(false)
    et là, le setOpaque ne marche pas, pourtant le getParent() me renvoi un contener qui extends de Component.

  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 lu la ligne de commentaire entre les deux lignes de code que j'ai donné?

  5. #5
    Membre averti
    Inscrit en
    Janvier 2011
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 24
    Par défaut
    Biensur! c'est pour ça que je n'appelle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this.getParent().setOpaque(false)
    qu'après avoir mis this parce que je suis dans un JPopupMenu

  6. #6
    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
    Pour les JPopupMenu il y a une façon particulière de les rendre visible si l'on est sur que le menu se trouvera dans l'interface.
    Il s'agit de la méthode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public void show(Component ivoker, int left, int right)
    .

    Cette méthode assure que le popup menu se trouvera dans l'interface graphique, et dans ce cas c'est la version lightweight du JPopupMenu qui sera affiché, et le setOpaque fonctionnera.

    Exemple:

    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
    package transparent.popupmenu.test;
     
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Image;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.io.IOException;
     
    import javax.imageio.ImageIO;
    import javax.swing.ImageIcon;
    import javax.swing.JButton;
    import javax.swing.JComponent;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPopupMenu;
    import javax.swing.border.LineBorder;
     
    public class TransparentPopupMenuTest {
        private boolean flag = false;
        private JFrame f;
        private JPopupMenu menu;
        private JLabel icon;
        private JButton b;
        public TransparentPopupMenuTest() {
            icon = new JLabel();
            icon.setIcon(new ImageIcon(getClass().getResource("/javax/swing/plaf/basic/icons/image-delayed.png")));
            menu = new JPopupMenu();
            menu.setLayout(new BorderLayout());
            menu.add(icon);
            menu.setOpaque(false);
            menu.setBorder(new LineBorder(Color.black));
            f = new JFrame();
            f.setSize(800, 600);
            f.setLocationRelativeTo(null);
            f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            b = new JButton("Show popup");
     
            b.addActionListener(new ActionListener() {
     
                @Override
                public void actionPerformed(ActionEvent arg0) {
                    if(flag == false) {
                        menu.show(b, 50, 50);
                        flag = true;
                        //menu.setVisible(true);
                    }
                }
            });
            f.add(b);
            f.setVisible(true);
     
        }
     
        public static void main(String[] args) {
            new TransparentPopupMenuTest();
        }
     
    }

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

Discussions similaires

  1. Mysql++, Fedora4 : erreur de fou
    Par CaptainChoc dans le forum Bibliothèques
    Réponses: 2
    Dernier message: 31/12/2005, 14h48
  2. fonction log me rend fou
    Par adel25 dans le forum C++
    Réponses: 2
    Dernier message: 16/10/2005, 10h16
  3. Lecteur CDROM Fou !!!
    Par MonsieurAk dans le forum Périphériques
    Réponses: 7
    Dernier message: 04/05/2005, 15h25
  4. document.frm.submit() je deviens fou
    Par franak dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 25/03/2005, 17h23
  5. [Tomcat 5.0][Log4j] Il devient fou !!!
    Par yolepro dans le forum Tomcat et TomEE
    Réponses: 9
    Dernier message: 24/04/2004, 21h08

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