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 :

SwingUtilities.invokeLater casse mon redimensionnment


Sujet :

AWT/Swing Java

  1. #1
    Expert confirmé
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Par défaut SwingUtilities.invokeLater casse mon redimensionnment
    Bonjour,

    Je suis en train de rendre redimensionnable une frame undecorated et je viens d'arriver. Tout marchait très bien, mais je me suis dit que logiquement il fallait faire les appels à setSize et setLocation dans l'EDT. J'ai donc rajouté des SwingUtilities.invokeLater pour les codes intervenant sur l'EDT et après ça ne marche plus correctement, c'est un peu aléatoire...

    Par exemple, avec un redimensionnement vers la gauche :

    avant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    final int westMove = origin.x + p.x;
    final int nextWestWidth = ((int)getSize().getWidth()) - westMove;
     
    if (	nextWestWidth > getMinimumSize().getHeight() && 
    	nextWestWidth < getMaximumSize().getHeight()){
    	setSize(nextWestWidth, (int)getSize().getHeight());
    	setLocation(getLocation().x + westMove, getLocation().y);
    }
    après :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    final int westMove = origin.x + p.x;
    final int nextWestWidth = ((int)getSize().getWidth()) - westMove;
     
    if (	nextWestWidth > getMinimumSize().getHeight() && 
    	nextWestWidth < getMaximumSize().getHeight()){
    	SwingUtilities.invokeLater(new Runnable(){
    		public void run(){
    			setSize(nextWestWidth, (int)getSize().getHeight());
    			setLocation(getLocation().x + westMove, getLocation().y);
    		}
    	});
    }
    Une fois que j'ai transformé le premier code dans le deuxième j'ai eu des problèmes. Tout ce code est appelé depuis la méthode mouseDragged qui écoute les déplacements souris.

    Est-ce que c'est normal ? J'imagine que ça doit à cause de la désynchronisation des actions et de l'interface, j'utilise la valeur de setLocation alors qu'elle a pas encore eu le temps de changer et j'utilise donc une valeur erronée...

    Et, est-ce que quelqu'un voit une manière de résoudre le problème en respectant quand même l'EDT ?


  2. #2
    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
    Par défaut
    Tu es déjà dans l'EDT sur les évènements souris...
    Comme tu fais un invokeLater, tu mets ton action "en file d'attente", et entre temps il peut se passer d'autres choses...
    Ici tu n'as pas besoin de invokeLater si tu exécutes dans des mouseDragged...

  3. #3
    Expert confirmé
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Par défaut
    Citation Envoyé par ®om
    Tu es déjà dans l'EDT sur les évènements souris...
    Comme tu fais un invokeLater, tu mets ton action "en file d'attente", et entre temps il peut se passer d'autres choses...
    Ici tu n'as pas besoin de invokeLater si tu exécutes dans des mouseDragged...
    Tu es sûr ?

    Tous les événements graphiques sont directement lancés dans l'EDT ?

  4. #4
    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
    Par défaut
    Citation Envoyé par wichtounet
    Tu es sûr ?

    Tous les événements graphiques sont directement lancés dans l'EDT ?
    Oui, pour t'en convaincre, écris dans ta méthode:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.out.println(SwingUtilities.isEventDispatchThread());
    ça doit afficher true

  5. #5
    Expert confirmé
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Par défaut
    Citation Envoyé par ®om
    Oui, pour t'en convaincre, écris dans ta méthode:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.out.println(SwingUtilities.isEventDispatchThread());
    ça doit afficher true
    En effet

    beaucoup ®om

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

Discussions similaires

  1. [Windows] SwingUtilities.invokeLater ralentit mon programme
    Par olivier57b dans le forum API standards et tierces
    Réponses: 3
    Dernier message: 31/10/2011, 16h53
  2. SwingUtilities.invokeLater : à quoi ça sert ?
    Par ANOVA dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 16/12/2007, 19h10
  3. <br /> casse mon parsing XML.
    Par sylvainhugues dans le forum Flash
    Réponses: 1
    Dernier message: 26/10/2006, 06h05
  4. Réponses: 17
    Dernier message: 10/07/2006, 19h13
  5. J'ai cassé mon serveur mysql4...
    Par Michaël dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 22/01/2005, 14h49

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