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 :

problèmes quand une fenetre passe sur l'application


Sujet :

AWT/Swing Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 127
    Points : 49
    Points
    49
    Par défaut problèmes quand une fenetre passe sur l'application
    Bonsoir,

    Je développe actuellement une application qui calcule des diagrammes issues de systèmes d'équations différentielles. J'ai créé une classe qui représente ma zone d'affichage. Elle hérite d'un JPanel et possède une awt Image buffer.

    Les calculs étant très couteux, un thread gère le calcul et dessine dans le buffer. Il appelle la méthode paintComponent de ma classe d'affichage que j'ai redéfini. Une fois le calcul fini, l'image dessinée est le résultat final. Jusque là tout va bien sauf que lorsque je fais passer une autre fenètres sur celle de mon application, l'image s'efface ... voici une capture d'écran explicite:



    Je ne vois pas d'où vient le problème. Avez vous été confronté à ce problème ? Etant vraiment bloqué et ayant fait des recherches, toute les hypothèses seront bonnes à prendre.

    Cordialement

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    le dessins d'un composant se fait au sein de la méthode paintComponent() (que tu dois, à priori, avoir surchargé pour qu'elle transfère ton image depuis le buffer vers l'écran). Si la zone reste grise, c'est que le parent a bien fait le nettoyage, mais que ton paintComponent(), lui, n'a pas fait son boulot. Regarde si
    1) tu dessine bien en surchargeant painComponent() (rappel, les composant graphiques n'ont pas de mémoire et doivent donc se redessiner quand des zones réapparaissent à l'écran, donc il faut que tu redessine)
    2) que tu n'a pas une exception quelconque qui se déclenche lors de ton paintComponent().

    PS: avoir le code de ton paintComponent pourrais être utile

  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 : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Le fameux rectangle gris, problème qui a été résolu en java 6.

    Sinon la source de ton problème est que tu dois faire des opérations un poil lourdes tout de même dans le thread de rendu (aka l'EDT c'est à dire le thread ou tu as créé ta JFrame) ce qui bloque l'opération de dessin et donc ton appli est dans l'impossibilité d'exécuter le code de dessin au moment ou tu enlèves la fenêtre qui se trouvait par dessus la tienne.

    Cf ce tuto: http://gfx.developpez.com/tutoriel/j...ing-threading/

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 127
    Points : 49
    Points
    49
    Par défaut
    La rapidité des membres à répondre m'étonnera toujours sur ce forum.
    Je viens de me rendre compte d'un truc dans mon code j'avais:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public void paint(Graphics g){
    	  if(buffer != null)
    	  this.getGraphics().drawImage(buffer, 0, 0, this);   
      }
    que j'ai logiquement remis à:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public void paint(Graphics g){
    	  if(buffer != null)
    	  g.drawImage(buffer, 0, 0, this);   
      }
    et maintenant je n'ai plus le problème précité... Quelqu'un pour m'expliquer? Je ne sais plus pourquoi j'avais abouti à la première version avec this.getGraphics qui manque cruellement d'esthétisme ...

    EDIT: corrigé g.drawImage

  5. #5
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    pourquoi pas directement g.drawImage()?

    g c'est l'endroit où tu doit peindre, this.getGraphics() c'est .... autre chose

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 127
    Points : 49
    Points
    49
    Par défaut
    oups pardon le code est bien g.drawImage() (erreur à taper le code)

  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 : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    getGraphics a moins d'un besoin très spécifique il ne faut juste pas l'utiliser, en effets le contexte graphique à utiliser est celui fourni par la méthode paintComponent(Graphics g) car on est sûr dans ce cas que ce sera celui utilisé pour le dessin de ton JComponent

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

Discussions similaires

  1. Window.Close() sur une fenetre fille ferme l'application
    Par MonsieurHelmut dans le forum Windows Presentation Foundation
    Réponses: 5
    Dernier message: 30/10/2009, 16h59
  2. Problème : Afficher une fenetre à coté du lien cliquer
    Par Tyrael62 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 30/09/2006, 00h37
  3. [Problème]Centrer une fenetre sur l'écran
    Par joker.benj dans le forum AWT/Swing
    Réponses: 5
    Dernier message: 14/05/2006, 22h49
  4. 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
  5. cacher une fenetre externe a l'application
    Par gaut dans le forum Windows
    Réponses: 4
    Dernier message: 13/12/2004, 14h38

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