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 :

une partie de l'interface s'affiche dans une autre lors d'un rafraichissement


Sujet :

AWT/Swing Java

  1. #1
    Membre du Club
    Inscrit en
    Février 2006
    Messages
    174
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 174
    Points : 62
    Points
    62
    Par défaut une partie de l'interface s'affiche dans une autre : setBounds en cause
    Je dois débuguer une application en Java qui pose un problème lors du rafraichissement d'un graphique de type Graphics.

    Voici le problème en image:



    ensuite la zone surrimprimée affiche bien le graphique. Qu'est-ce qui peut provoquer cela? trop d'appel à paint()? Quelles pistes me conseillez-vous pour contourner ce problème de rafraichissement?

    ça ne le fait que dans cette zone.
    Merci d'avance...



    PS: je débute

  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
    Cela se produit aléatoirement lorsque l'on ne redessine pas tout le graphics passé à une méthode type paint*.

    Cela dépend un peu de ton contexte évidemment (il arrive que le dessin sur le graphics soit délégué à plusieurs méthodes) mais au final, il faut que tout le rectangle du Graphics ait été dessiné, soit avec une couleur classique, soit avec la transparence.
    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
    Membre du Club
    Inscrit en
    Février 2006
    Messages
    174
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 174
    Points : 62
    Points
    62
    Par défaut
    Citation Envoyé par gifffftane Voir le message
    Cela se produit aléatoirement lorsque l'on ne redessine pas tout le graphics passé à une méthode type paint*.

    Cela dépend un peu de ton contexte évidemment (il arrive que le dessin sur le graphics soit délégué à plusieurs méthodes) mais au final, il faut que tout le rectangle du Graphics ait été dessiné, soit avec une couleur classique, soit avec la transparence.
    Mais est-ce que ça peut venir de la façon dont est construite l'interface? Parce que si je désactive le code qui déssine l'histogramme, le problème subsiste.

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    	super(new BorderLayout());
     
         	//on en aura besoin plus tard
    		this.table = table;
     
    		lborder = new EmptyBorder(5, 5, 5, 5);
    		this.setBorder(lborder);
     
    		linfoAttr = new JLabel();
    		linfoAttr.setBorder(lborder);
    		ldiscretise = (String)System.getProperty("ldattr.discretise");
     
    		this.graphic = graphic;
     
    		// on veut avoir ?gauche, le nom de l'attr, son type et le graphique
    		add(linfoAttr, BorderLayout.NORTH);
     
    		// Partie inféieure
    		southPanel = new JPanel();
    		southPanel.setLayout(null);
     
    		// à gauche, ldiscretise, la combo, les paramères
    		westPanel = new JPanel(new BorderLayout());
    		westPanel.add(cb, BorderLayout.NORTH);
    		westPanel.add(params, BorderLayout.SOUTH);
    		westPanel.setBorder(lborder);
    		// Placer westPanel sur le JPanel methGraphPanel
    		westPanel.setBounds(15,15,(southPanel.getWidth()-30)*2/5,(southPanel.getHeight()-30));
     
    		Border etched = BorderFactory.createLineBorder(Color.LIGHT_GRAY, 1);
    		westPanel.setBorder(etched);
     
    		southPanel.add(westPanel,BorderLayout.WEST);
     
    		//bouton pour affiner
    		affinageBouton = new JButton(System.getProperty("baffiner"));
    		//Le bouton est inactif, on l'activera uniquement lorsque les paramères seront suffisants
    		affinageBouton.setEnabled(false);
    		affinageBouton.addActionListener(this);
     
    		panelBouton = new JPanel();
    		graphicEtBouton = new JPanel(new BorderLayout());
    		panelBouton.add(affinageBouton);
    		graphicEtBouton.add(panelBouton , BorderLayout.SOUTH);
    		linfoGraphe = new JLabel(System.getProperty("tborder.graphique"));
    		graphicEtBouton.add(linfoGraphe, BorderLayout.NORTH);
    		// Placer graphicEtBouton
    		graphicEtBouton.setBounds(20+westPanel.getWidth(),15,(southPanel.getWidth()-30)*3/5,(southPanel.getHeight()-30));
     
    		graphicEtBouton.setBorder(etched);
     
    		southPanel.add(graphicEtBouton , BorderLayout.EAST);
    		this.add(southPanel, BorderLayout.CENTER);
    Sur ce code, à ce que j'ai compris, j'ai un panneau au "sud" contenant à gauche des éléments et à droite mon graphique. Ne vaut-il pas mieux isoler les éléments de l'interface?

  4. #4
    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
    Peut être que je t'ai envoyé sur un fausse piste : le phénomène dont je t'ai parlé ne peut se produire si on ne fait qu'emboiter des boîtes.

    Heu... je suis un peu perdu, avec toutes ces boîtes qui s'emboîtent... peux-tu re-exprimer quel est le problème ?
    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é.

  5. #5
    Membre du Club
    Inscrit en
    Février 2006
    Messages
    174
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 174
    Points : 62
    Points
    62
    Par défaut
    Citation Envoyé par gifffftane Voir le message
    Peut être que je t'ai envoyé sur un fausse piste : le phénomène dont je t'ai parlé ne peut se produire si on ne fait qu'emboiter des boîtes.

    Heu... je suis un peu perdu, avec toutes ces boîtes qui s'emboîtent... peux-tu re-exprimer quel est le problème ?
    J'ai bien l'impression que sur les sources, des boîtes sont emboitées... Les développeurs ont tout codé à la main... arf.

  6. #6
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Citation Envoyé par skystef Voir le message
    Je dois débuguer une application en Java qui pose un problème lors du rafraichissement d'un graphique de type Graphics.

    [...]

    ensuite la zone surrimprimée affiche bien le graphique. Qu'est-ce qui peut provoquer cela? trop d'appel à paint()? Quelles pistes me conseillez-vous pour contourner ce problème de rafraichissement?
    Generalement (mais pas toujours) ca provient d'une mauvaise utilisation du Graphics ; par exemple garder une reference sur et manipuler le Graphics retourne par getGraphics(). Ou encore faire des operation 2D en oubliant d'annuler toutes les transformations effectuees en cours de traitement. Ou bien ne pas dessiner du tout le composant ou faire un composant transparent sans faire setOpaque(false). Bref, il faudrai demonter la GUI et voir quel composant est respondable de ce probleme.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  7. #7
    Membre du Club
    Inscrit en
    Février 2006
    Messages
    174
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 174
    Points : 62
    Points
    62
    Par défaut
    Citation Envoyé par bouye Voir le message
    Generalement (mais pas toujours) ca provient d'une mauvaise utilisation du Graphics ; par exemple garder une reference sur et manipuler le Graphics retourne par getGraphics(). Ou encore faire des operation 2D en oubliant d'annuler toutes les transformations effectuees en cours de traitement. Ou bien ne pas dessiner du tout le composant ou faire un composant transparent sans faire setOpaque(false). Bref, il faudrai demonter la GUI et voir quel composant est respondable de ce probleme.
    Merci, je vais voir ce que je trouve avec ces pistes.

  8. #8
    Membre du Club
    Inscrit en
    Février 2006
    Messages
    174
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 174
    Points : 62
    Points
    62
    Par défaut
    Je pense avoir trouver l'origine du problème.

    Dans le code qui créé l'interface, il y a ces lignes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    graphicEtBouton.setBounds(20+westPanel.getWidth(),15,(southPanel.getWidth()-30)*3/5,(southPanel.getHeight()-30));
    Si j'ai bien compris, ils créent le graphique avec son bouton puis ils le placent en utilisant cette fonction qui le déplace au sein de l'interface.

    En gros, on verrait la trainée du déplacement? Je dis ça car lorsque le phénomène se produit, ça fait clignoter l'interface générale en haut à gauche, là où il y a la zone qui se surimprime...

    Quelqu'un pourrait-il confirmer cette hypothèse?

  9. #9
    Membre du Club
    Inscrit en
    Février 2006
    Messages
    174
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 174
    Points : 62
    Points
    62
    Par défaut
    UP,


    J'ai essayé d'autres solutions comme transformer mon graphique comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Graphics2D g2 =(Graphics2D) g;
    		//g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.1f ));
    		g2.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_SPEED);
    		g2.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_SPEED);
    		g2.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_OFF);
    		g2.setRenderingHint(RenderingHints.KEY_DITHERING, RenderingHints.VALUE_DITHER_DISABLE);
    Cette technique provenant de ce site permet d'optimiser le rendu, mais ça ne change rien.
    Je viens d'installer sur Mac OS X l'application et ça affiche un carré gris en haut à gauche de l'interface comme suit:



    J'ai essayé d'enlever au panel qui contient mon graphique son opacité (setOpaque(false)) Mais ça ne marche pas.

    Je suis perdu... Sur Windows, ça surimprime cette zone pendant quelque secondes (encore pire donc).

    Ah oui, ça ne le fait pas la première fois, seulement quand le graphique est mis à jour (à chaque fois que je coche une case).


    Mise à jour: ce qui est fort c'est que si je désactive le cadre du graphique, ça continue... . par contre si dans la méthode update de ma fenêtre du programme je commente ces lignes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    //westPanel.setBounds(15,15,(southPanel.getWidth()-30)*2/5,(southPanel.getHeight()-30));
     
    //graphicEtBouton.setBounds(20+westPanel.getWidth(),15,(southPanel.getWidth()-30)*3/5,(southPanel.getHeight()-30));

    le problème disparaît... comment éviter le setBounds?

  10. #10
    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
    • Pourquoi fais-tu un setBounds ? Normalement, quand on organise sa GUI avec des layouts, on a jamais besoin de faire des setBounds.
    • Pourquoi places-tu des composants dans la méthode update ? C'est DANGEREUX de faire ça ! Les méthodes de ce type (avec la famille des méthodes paint) sont là pour dessiner les composants, pas pour les placer ; les composants graphiques sont censés être placés à ce moment là.

    Bien sûr, il y a toujours des exceptions ; peut être es-tu dans ce cas là ?
    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é.

Discussions similaires

  1. Copier une partie du contenue d'un fichier dans un autre fichier
    Par jvkd59 dans le forum VB 6 et antérieur
    Réponses: 21
    Dernier message: 18/09/2010, 15h49
  2. Réponses: 3
    Dernier message: 04/07/2008, 12h00
  3. Réponses: 2
    Dernier message: 16/05/2007, 17h18
  4. Réponses: 1
    Dernier message: 15/04/2007, 20h09
  5. Réponses: 1
    Dernier message: 14/05/2006, 19h52

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