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 :

Un panel par dessus un autre


Sujet :

AWT/Swing Java

  1. #1
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut Un panel par dessus un autre
    Salut,

    J'ai un composant graphique (on va dire un panel) sur lequel je ne peux pas écouter les clics de souris (mais par contre les clics font des actions que je souhaite ne pas faire).
    Je voudrais donc ajouter par-dessus un panel (invisible) qui me permette d'intercepter les clics de souris.

    J'ai donc fais un JLayeredPane, sur lequel j'ai ajouté mon premier composant, puis un panel par dessus.

    Comment je peux définir que les clics de souris ne doivent être provoqués que par le panel du dessus (qui est invisible)?

    Un peu à la manière des glasspane, mais je ne suis pas au niveau de la JFrame là, c'est juste pour un panel...

    Merci d'avance de votre réponse qui me sera d'une grande aide

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

    C'est quand même bizarre, ce que tu dis là. C'est vraiment pas trop propre, mais bon.
    Si tu regardes la démo de Sun sur le GlassPane, tu verras qu'il redirige les évènements. Tu peux faire de même en testant que le clic n'a pas été fait sur le composant en question (SwingUtilities.getDeepestComponentAt(int x, int y)). Ailleurs, tu redispatches, sur le composant, tu ne redispatches pas et tu traites l'évènement comme tu veux.

  3. #3
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    Citation Envoyé par xavlours
    Bonjour,

    C'est quand même bizarre, ce que tu dis là. C'est vraiment pas trop propre, mais bon.
    Ouais mais apparemment je n'ai pas le choix. Le composant est un composant ActiveX géré en natif, et malheureusement, il gère lui-même les évènements (en C)

    Citation Envoyé par xavlours
    Si tu regardes la démo de Sun sur le GlassPane, tu verras qu'il redirige les évènements. Tu peux faire de même en testant que le clic n'a pas été fait sur le composant en question (SwingUtilities.getDeepestComponentAt(int x, int y)). Ailleurs, tu redispatches, sur le composant, tu ne redispatches pas et tu traites l'évènement comme tu veux.
    Moi quand je fais un JPanel en tant que GlassPane de ma JFrame, ça s'affiche bien, mais si on clique, ça clique aussi sur ce qu'il y a au-dessous... Comment faire pour que les clics ne "traversent" pas le GlassPane?

  4. #4
    Gfx
    Gfx est déconnecté
    Expert éminent
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Points : 8 178
    Points
    8 178
    Par défaut
    Facile :

    maFrame.getGlassPane().addMouseListener(new MouseAdapter() { });

  5. #5
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    Arf de toute façon le composant c'est un java.awt.Canvas, donc un composant awt, on ne va pas pouvoir dessiner par dessus en swing

  6. #6
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    Citation Envoyé par Gfx
    Facile :

    maFrame.getGlassPane().addMouseListener(new MouseAdapter() { });
    Ah ouais

    Tiens, c'est étonnant, comment ça se fait que ça empêche les clics?
    Car c'est juste un "addMouseListener", c'est parce que s'il n'y a pas de listeners sur le glassPane, ça passe "au-dessous"?

    Sinon, as-tu une solution pour faire comme un glasspane, mais au-dessus d'un composant AWT intégré dans du Swing?

  7. #7
    Gfx
    Gfx est déconnecté
    Expert éminent
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Points : 8 178
    Points
    8 178
    Par défaut
    On ne peut rien faire pour passer au dessus d'AWT. Si tu veux juste intercepter les clics et que le glass pane ne marche pas avec ton composant AWT, essaye de passer par un AWTEventListener avec un masque sur les evenements souris que tu pourras consommer.

  8. #8
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    Et depuis java 6.0 beta 2 (il me semble), j'ai un problème plus grave. Voici une image du début de l'application (g intégré l'activeX à l'arrache dans la partie droite de la fenêtre).


    Le problème, c'est que dès que je lance une lecture, ou même quand je survole la partie de l'écran contenant l'ActiveX VLC, la JVM plante totalement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #
    # An unexpected error has been detected by Java Runtime Environment:
    #
    #  EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x6d103cc9, pid=3904, tid=772
    #
    # Java VM: Java HotSpot(TM) Client VM (1.6.0-beta-b59g mixed mode, sharing)
    # Problematic frame:
    # C  [awt.dll+0x103cc9]
    #
    # An error report file with more information is saved as hs_err_pid3904.log
    #
    # If you would like to submit a bug report, please visit:
    #   http://java.sun.com/webapps/bugreport/crash.jsp
    #

  9. #9
    Gfx
    Gfx est déconnecté
    Expert éminent
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Points : 8 178
    Points
    8 178
    Par défaut
    Java SE 6, pas Java 6.0

    Plus serieusement, ca ressemble a un bug grave dans le code de la JVM. Essaye avec une version plus recente (http://mustang.dev.java.net) et envoie un rapport de bug a Sun.

  10. #10
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    Citation Envoyé par Gfx
    Java SE 6, pas Java 6.0
    Les numérotations de java changent tout le temps

    java 1.4
    java 5.0
    java se 6


    Citation Envoyé par Gfx
    Plus serieusement, ca ressemble a un bug grave dans le code de la JVM. Essaye avec une version plus recente (http://mustang.dev.java.net) et envoie un rapport de bug a Sun.
    Ah bah merci, c corrigé avec la dernière
    Un grand merci

    Enfin, pour mon autre problème, tu as un petit tuto sur AWTEventListener (c'est pas un listener comme les autres celui-là) ? (pour intercepter juste les clics qui sont sur le composant awt)

  11. #11
    Gfx
    Gfx est déconnecté
    Expert éminent
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Points : 8 178
    Points
    8 178
    Par défaut
    C'est J2SE 1.4, J2SE 5.0 et Java SE 6. Et c'est pire que ca ! Car si on parle bien de J2EE 1.4, on doit dire Java EE 5 (et non pas J2EE 5.0 comme J2SE 5.0). Quel bordel

    Exemple rapide de l'AWTEventListener :

    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
     
        // installeur deux AWTEventListener qui ecoutent des evenements clavier
        private static void setupFrameCapableOfInsight(JFrame frame) {
           Toolkit.getDefaultToolkit().addAWTEventListener(new GlassPaneActivator(FadingPanel.class, KeyEvent.VK_F12), AWTEvent.KEY_EVENT_MASK);
           Toolkit.getDefaultToolkit().addAWTEventListener(new GlassPaneActivator(RotatingPanel.class, KeyEvent.VK_F11), AWTEvent.KEY_EVENT_MASK);
        }
     
    // code de l'ecouteur
     
    public class GlassPaneActivator implements AWTEventListener {
        // plein de code sans aucun rapport
        public void eventDispatched(AWTEvent event) {
            if (event.getID() == KeyEvent.KEY_PRESSED) {
                KeyEvent keyEvent = (KeyEvent) event;
     
                if (keyEvent.getKeyCode() == keyCode) {
                    Window windowAncestor = SwingUtilities.getWindowAncestor((Component) event.getSource());
                    if (windowAncestor instanceof JFrame) {
                        toggleInsight((JFrame) windowAncestor);
                    }
                }
            }
        }
        // plein de code sans aucun rapport
    }

  12. #12
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    Merci, je vais regarder ça plus en détails...
    À première vue, une question:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    toggleInsight((JFrame) windowAncestor);
    Elle est où cette méthode que tu appelles?


    Sinon, je viens de penser à un autre problème... Le menu de ma fenêtre (JMenuBar) ne s'affichera pas non plus devant l'écran (vu que c'est du Swing et que l'écran est en AWT)

  13. #13
    Gfx
    Gfx est déconnecté
    Expert éminent
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Points : 8 178
    Points
    8 178
    Par défaut
    Cette methode est dans les endrois marques par "// plein de code sans aucun rapport".

    Pour les menus, il faut utiliser cela :

    JPopupMenu.setLightWeightPopupEnabled(false)

  14. #14
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    Citation Envoyé par Gfx
    Cette methode est dans les endrois marques par "// plein de code sans aucun rapport".

    Pour les menus, il faut utiliser cela :

    JPopupMenu.setLightWeightPopupEnabled(false)
    OK, merci beaucoup.
    (et à partir du JMenu, j'applique ça avec .getPopupMenu()?)

    Et pour les ToolTip, c'est possible aussi?
    (sur un composant setToolTipText("Mon texte");, si l'info-bulle s'affiche près de l'écran, elle est coupée)


    Encore une question... Pour l'écran, j'ai pensé à une petite astuce : mettre l'écran dans une JWindow sans decoration, et la JWindow suivrait un composant (taille, position...) grâce à ComponentListener. Ca permettrait de donner l'illusion de changer l'écran de composant parent (par exemple pour le mettre dans une mini-fenêtre) sans pour autant mettre STOP puis PLAY si une lecture est en cours.
    Le problème, c'est donc les menus, là il est forcément impossible qu'ils passent par-dessus... Mais aussi comment pouvoir être sûr que la fenêtre de l'application est toujours au-dessous de la JWindow, sans pour autant que celle-ci soit alwaysOnTop...?
    Enfin si c possible d'avoir correctement les menus par-dessus, je vais abandonner cette hypothèse...

  15. #15
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    Je me suis inspiré de ton code, mais je ne vois vraiment pas comment faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
            Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener() {
                public void eventDispatched(AWTEvent event) {
                    // ???
                }
            }, AWTEvent.MOUSE_EVENT_MASK);
    Je voudrais que tous les clics soient bien appliqués comme si je n'avais rien changé, sauf si le clic a eu lieu sur l'écran ActiveX, il doit être "annulé"..

  16. #16
    Membre émérite
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Points : 2 410
    Points
    2 410
    Par défaut
    Citation Envoyé par ®om
    Je voudrais que tous les clics soient bien appliqués comme si je n'avais rien changé, sauf si le clic a eu lieu sur l'écran ActiveX, il doit être "annulé"..
    Eh bien, je reviens à la charge : un petit test avec SwingUtilities.getDeepestComponentAt(int, int) (en espérant que ça marche avec un composant AWT, mais je ne vois pas pourquoi ça ne parcherait pas). Si il est différent du composant bizarroïde, tu t'inspires du GlassPaneDemo pour redispatcher l'évènement.

  17. #17
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    OK, merci, mais en fait je crois que c'est peine perdue...

    J'ai ajouté un MouseListener sur mon composant AWT:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
            addMouseListener(new MouseAdapter() {
                @Override public void mouseClicked(MouseEvent e) {
                    System.out.println("***");
                }
            });
    Il n'y a aucun composant "par-dessus" ce composant, et pourtant, il ne reçoit pas les évènements de la souris, qui doivent être traités en C

Discussions similaires

  1. Afficher un composant d'un panel par dessus un autre ?
    Par dr23fr dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 29/10/2007, 18h01
  2. Un background par dessus un autre
    Par psychoBob dans le forum Mise en page CSS
    Réponses: 1
    Dernier message: 14/05/2006, 12h04
  3. Probléme lorsqu'une fenétre passe par dessus l'autre...
    Par hostile dans le forum Interfaces Graphiques en Java
    Réponses: 4
    Dernier message: 03/01/2006, 19h20
  4. Comment faire passer un menu par dessus une autre frame
    Par barthelv dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 29/11/2005, 11h03
  5. [débutant]Placer une image par dessus une autre
    Par sempire dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 21/11/2005, 18h42

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