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 :

getLocationOnScreen() et compiz : comment contourner le bug ?


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Par défaut getLocationOnScreen() et compiz : comment contourner le bug ?
    Bonjour,

    Dans mon appli, je veux afficher une JWindow en-dessous d'un point de mon composant, lors d'un MouseMoved sur celui-ci. En gros, je souhaite faire un "hint" élaboré avec une fenêtre à moi.

    Tout fonctionne très bien sous Windows, ainsi que sous Linux sans compiz activé. Mais dès que j'active compiz, la fenêtre s'affiche à un mauvais endroit : l'endroit où elle devrait s'afficher si la fenêtre maître n'avait pas été déplacée depuis sa création.

    Cela semble être un bug connu de la méthode getLocationOnScreen() avec compiz. J'ai aussi essayé SwingUtilities.convertPointToScreen, mais évidemment celle-ci utilise getLocationOnScreen()

    Donc je cherche un moyen de contourner ce bug. Utiliser une autre méthode, ou je ne sais quoi, qui me permettrait de connaître la position écran d'un point sans passer par ces méthodes buguées. Je n'ai trouvé aucune solution sur Internet jusqu'à présent.

    Une autre alternative serait de réussir à positionner la JWindow relativement à mon composant, si c'est possible et que cette autre solution ne passe pas elle-même par getLocationOnScreen().

    d'avance
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  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
    Mettre à jour la JVM vers la denière update de java 6?

    Car le versions précédentes entraient plus ou moins en conflit avec Compiz. Voir passer à OpenJDK ou IcedTea

  3. #3
    Membre Expert
    Avatar de natha
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 346
    Par défaut
    Perso j'ai java1.6.0_03 sous Ubuntu et j'ai aussi un problème de positionnement mais je ne crois pas que ça soit getLocationOnScreen qui pose problème.

    Je stoque dans un fichier la position de mes fenêtres, quand je les rouvre elles sont censée s'afficher au même endroit que la dernière fois or ça se décale toujours de 5px vers la gauche et 5px vers le haut (si j'ouvre/ferme 50x la fenêtre elle sera presque dans le bord haut/gauche de mon écran).

    En mettant un listener sur la fenêtre je me suis rendu compte qu'elle est d'abord affichée au bon endroit puis qu'elle est déplacée. Je pense que c'est parce que Compiz dessine les bords seulement après l'affichage de la fenêtre ce qu'il fait qu'il décale tout à chaque fois.


    Bon et sous Compiz la zone de notification n'est pas supportée... si c'est pas débile de la part de Sun d'avoir hard-codé les window manager compatibles...

  4. #4
    Expert confirmé

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Par défaut
    Je suis déjà passé à la dernière update du JRE et JDK. Quant à passer à une autre JVM... Euh... Ca serait quand même bien de rester compatible, c'est un peu le but de Java

    @natha : je ne pense pas qu'on ait le même problème, du tout. Chez moi, le décalage est bien plus important que seulement 5px. En fait ce n'est même pas un décalage à proprement parler. Comme je l'ai dit, le positionnement de ma fenêtre est tout à fait exact, mais si et seulement si je ne bouge pas ma fenêtre à partir de son affichage. Car sinon, les JWindow sont quand même affichées là où elles auraient dû l'être si je n'avais pas bougé ma fenêtre.
    Donc si je bouge ma fenêtre à l'autre bout de l'écran, mes "hint" sont quand même affichés à l'endroit d'origine

    Et le problème vient bien de getLocationOnScreen. C'est un bug déjà signalé notamment ici (bien que ce ne soit pas dans un bug-report de Java lui-même) :
    https://bugs.launchpad.net/latexdraw/+bug/194733
    The problem comes from the 'getLocationOnScreen()' method that, with Compiz, always returns the original position of the component.
    Ca ne me paraît même pas "idiot", dans le sens où il est fort probable que Compiz simule le non-déplacement des fenêtres, pour être plus efficace dans son dessin. Et alors getLocationOnScreen n'en peut rien : il ne pourrait pas savoir qu'on n'est plus au même endroit qu'au début
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  5. #5
    Membre Expert
    Avatar de natha
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 346
    Par défaut
    Ah ok...
    Moi je n'utilise pas getLocationOnScreen en fait, je viens de vérifier, j'utilise frame.getX() et frame.getY()

  6. #6
    Expert confirmé

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Par défaut
    Citation Envoyé par natha Voir le message
    Ah ok...
    Moi je n'utilise pas getLocationOnScreen en fait, je viens de vérifier, j'utilise frame.getX() et frame.getY()
    Ah ! Je vais essayer ces deux méthodes, ça fonctionnera peut-être mieux
    Je te tiens au courant.
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

Discussions similaires

  1. Réponses: 9
    Dernier message: 04/01/2012, 09h54
  2. Comment contourner un bug ie si 1 colonne 'descend'
    Par mtroya dans le forum Mise en page CSS
    Réponses: 4
    Dernier message: 09/01/2009, 20h43
  3. Réponses: 6
    Dernier message: 05/04/2006, 14h14
  4. Comment corriger le bug de RightClickSelect du treeview de Delphi 7 ?
    Par bambino3996 dans le forum Composants VCL
    Réponses: 2
    Dernier message: 01/08/2005, 13h47
  5. Comment contourner l'erreur ?
    Par Le Pharaon dans le forum Langage SQL
    Réponses: 2
    Dernier message: 24/07/2005, 10h21

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