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

Agents de placement/Fenêtres Java Discussion :

JFrame : Effet "sapin de noël"


Sujet :

Agents de placement/Fenêtres Java

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    268
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 268
    Points : 199
    Points
    199
    Par défaut JFrame : Effet "sapin de noël"
    Bonjour,

    Je cherche à résoudre un problème d'affichage assez gênant : Dans une fenêtre, lors de "changement", l'interface donne une impression de clignotement. J'ai essayé par exemple de mettre un GIF animé, lorsque des traitements sont en cours, mais à chaque mouvement de l'icône, la fenêtre clignote, comme si tous les éléments graphiques était réaffichés.

    Etant donné la complexité du projet, je ne sais pas trop où chercher. Donc avant d'entrer dans les détails, je voudrais savoir :
    - A quels endroits doit-je chercher ? Des méthodes "refresh()", des méthodes "paint()" ou assimilée ?
    - Doit-je chercher du coté de la JFrame (contenant des splitPane), ou plutôt des composants ?
    Pensez au tag quand votre problème est réglé !

  2. #2
    Membre émérite
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Points : 2 582
    Points
    2 582
    Par défaut
    Je ne vois malheureusement pas de réponse miracle.

    C'est le paint qui génère tous les affichages, mais ce qui a motivé la demande est perdu au moment où il est activé.

    Ton clignotement peut très bien venir d'un paint mal fait, d'un listener mal fait, d'un EDT mal fait... bon courage, désolé
    Mieux que Google, utilisez Sur Java spécialisé sur la plate-forme java !
    Pour réaliser vos applications Java dans le cadre de prestations, forfait, conseil, contactez-moi en message privé.

  3. #3
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Ne pas faire de traitements longs dans le thread principal (à savoir l'EDT).
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    268
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 268
    Points : 199
    Points
    199
    Par défaut
    Ben en fait, je n'ai que le thread principal
    Il faudrait que je gère ma JFrame principale (lancée par le main()) dans un autre thread, mais je n'y arrive pas, je reviens toujours dans l'EDT.
    Me reste plus qu'à apprendre un peu plus le fonctionnement des threads, j'aurais peut être un début de solution. Je reviendrais à ce moment là
    Pensez au tag quand votre problème est réglé !

  5. #5
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Grosso modo toute tâche potentiellement (accès DB & cie) doit être fait dans un thread séparé.
    Par contre toute opération touchant aux composants Swing et à leurs modèles doit être faite dans l'EDT.

    cf http://gfx.developpez.com/tutoriel/j...ing-threading/
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    268
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 268
    Points : 199
    Points
    199
    Par défaut
    Ha, j'aurais pensé que les composants swingg devait être dans des theads séparés.
    Actuellement, les traitements lourds (DB, mais aussi certaines actions (enregistrement ou édition de documents)) sont threadisés.
    Dans le lien, j'ai remarqué (rapidement) que les "actionPerformed" contenait des thread. Je vais tester voir si j'ai des améliorations.
    Ce qui m'embête, c'est que les différentes démos que j'essaie n'ont pas ce problème, même en ayant plus de "paint" ou "paintall" que moi

    Au passage, est-ce que les refresh / repaint se font du container vers les contenus, ou le contraire ?
    Pensez au tag quand votre problème est réglé !

  7. #7
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Ils se font bien du conteneur vers le contenu.

    Ensuite il faut voir exactement ce que tu réalises qui pourrait expliquer ce phénomène. Tu travailles avec java2D (donc des redéfinitions de composants) ou juste avec les composants standards.
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    268
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 268
    Points : 199
    Points
    199
    Par défaut
    J'ai une classe par composant, qui englobe la classe java correspondante. Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public class NCompTexte {
    	/** Le JLabel affichant l'intitulé du composant texte */
    	private JLabel leJLabel;
     
    	/** Le champ de texte (JTextField ou JTextArea - Ancêtre=JTextComponent) */
    	private JTextComponent leTextComponent;
    }
    Une classe pour les champs textes, combo, ... Y compris aussi pour les JTabbedPane. Bref, apparement, pour tous les composants graphiques.

    Du coup, si je mets un gif animé dans l'entête d'un onglet, il va rafraichir tous les composants (puis leurs sous-composants) ? Le problème, c'est que c'est aussi le cas en sens inverse (rafraichir un composant rafraichit aussi son container, et ainsi de suite).
    Pensez au tag quand votre problème est réglé !

  9. #9
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    L'entête d'un onglet est un sous composant du JTabbedPane et ne fait pas directement partie du JTabbedPane en lui même.
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    268
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 268
    Points : 199
    Points
    199
    Par défaut
    Donc retour à la case départ : Il faut que je cherche ce qui provoque une actualisation de mes composants
    Je vais faire du ménage dans toutes les classes concernant l'affichage, afin de trouver la partie de code qui n'est pas bonne.

    Merci !
    Pensez au tag quand votre problème est réglé !

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