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 :

Affichage pollué sous Windows 10


Sujet :

AWT/Swing Java

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 265
    Par défaut Affichage pollué sous Windows 10
    Bonjour,

    Je travaille sur trois environnement différents : Windows 8.1, Windows 10 et MAC OS/X .
    Sous Windows 8.1 et OS/X je n'ai aucun problème d'affichage des panneaux développés en SWING uniquement (sous éclipse).
    Par contre sous Windows 10 il arrive fréquemment que l'affichage soit pollué par une un recouvrement d'une partie du même panneau à n'importe quel endroit.
    Le fichier joint est une capture d'écran qui vous expliquera mon problème sans besoin de faire de longs discours.

    Le niveau de Java que j'utilise est : 1.8.0_161 en mode 64 bits.

    Vous remarquerez donc dans la partie inférieure droite de l'image, la duplication de la partie gauche supérieure du panneau.
    Comme je l'ai signalé plus haut ce n'est pas systéatique, et ce n'est pas toijours la même partie du panneau qui est dupliquée.
    Y-a-il des précautions particulières à prendre pour programmer en Swing pour java sous Windows 10. quelqu'un a-t-il été confronté à un problème similaire ?

    Merci d'avance

    Gégé
    Images attachées Images attachées  

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    C'est typiquement le genre de problèmes qu'on a lorsqu'on joue directement avec les Graphics2D au lieu de laisser Swing gérer ça comme c'est prévu et n'est pas dépendant spécialement de Windows 10. Le contexte graphique de l'UI étant recyclé (donc utilisé pour dessiner le fond de plusieurs composants), on risque de se retrouver avec des bouts de composants déjà dessinés dans le fond, mais le comportement n'est pas prévisible.

    En particulier, lorsqu'on "oublie" d'appeler super.paintComponent(Graphics) lorsqu'on redéfinit cette méthode (ou toute autre méthode du genre). Ou qu'on cherche à accéder directement à l'instance de Graphics par getGraphics().

    Sans code, difficile d'en dire plus.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 265
    Par défaut
    Merci pour cette réponse rapide. Effectivement pour définir une texture j'avais redéfini la méthode paintComponent du panneau principal sans appeler super.paintComponent. Je vais modifier le code et voir si cela est résolu.
    C'est quand même bizarre que depuis 3 ans où cette application tournait sous Windows 8.1, jamais je n'ai rencontré ce problème.

    Merci encore

    Gégé

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Tu utilises TexturePaint pour ta texture ? Montre ton code, si tu veux des conseils...
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 265
    Par défaut
    L'ensemble de l'application fait plusieurs milliers de ligne de code, mais je vais simplement te montrer ci_dessous comment j'ai défini la texture.
    Cependant j'ai toujours le problème en ayant ajouté super.paintComponent(g) (à moins que j'ai fait une erreur dans la place de l'instruction).
    Quoi qu'il en soit je te remercie encore pour ton assistance.

    Gégé

    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
     
    MonPanneau = new JPanel()
    		{
    				protected static final long serialVersionUID = 1L;
    				@Override
    				  protected void paintComponent(Graphics g) 
    				  {
    					 super.paintComponent(g); 
    					java.awt.image.BufferedImage bi =null;
    					try 
    					{
    						bi = ImageIO.read(getClass().getResource("/images/fond.jpg"))   ;
    						TexturePaint tp = new TexturePaint(bi, new Rectangle(0, 0, 200, 200)); 
    						Graphics2D g2 = (Graphics2D) g;
    						g2.setPaint(tp);
    				               g2.fill(new Rectangle(0, 0, getWidth(), getHeight()));
    				                g2.setPaint(tp);
    					} 
    					catch (Exception e) {System.out.println(e.toString());}
    				  };
    		};
    			MonPanneau.setLayout(null);
    			MonPanneau.setBounds(10, 11, 1013, 576);

  6. #6
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Tu devrais éviter de faire du chargement de ressource dans l'EDT. Tu peux créer l'instance de texture à part. Ceci fera déjà gagner un peu de temps sur le traitement d' update de l'UI. Il est souvent mieux de créer un contexte local pour éviter d'avoir à restituer le contexte intact (ce qu'il vaut mieux toujours faire dans ces cas là)

    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
    public class TexturedPanel extends JPanel {
     
            private TexturePaint paint;
     
     
            public TexturedPanel() { 
    		try {
    		     paint = new TexturePaint(ImageIO.read(TexturedPanel.class.getResource("/images/fond.jpg")), new Rectangle(0, 0, 200, 200)); 
    		} 
    		catch (IOException e) {
                          System.err.println(e);
                    }
            }
     
            protected void paintComponent(Graphics g) {
                  super.paintComponent(g);
                  if ( paint!=null ) {
                       Graphics2D g2d = (Graphics2D)g.create();
                       g2d.setPaint(paint);
                       g2d.fillRect(0,0,getWidth(),getHeight());
                       g2d.dispose();
                  }
            }
     
    }
    Après, je ne pense pas que le problème soit là. Tu n'appelles jamais Component.getGraphics() par exemple ?
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 265
    Par défaut
    OK, j'ai donc modifié mon code pour redéfinir mon JPanel en TexturedPanel. Je vais faire des essais en espérant que ceci règle le problème.

    Merci encore

    Gégé

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 265
    Par défaut
    Désolé d'avoir attendu un peu, mais je voulais faire des tests plus longtemps. Pour l'instant ça a l'air de marcher correctement et je te remercie encore beaucoup pour cette aide efficace.
    Bonne soirée

    Gégé

  9. #9
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Mmm, si tu n'as fait que changer le panel, et que ça a corrigé le problème, tu n'as en quelque sorte que reporté l'échéance que ça ne fonctionne plus. Parce que tout ce que mon code fait, c'est gagner du temps sur le temps de dessin du panel. Cette différence de temps peut expliquer la différence de comportement entre Windows 8.1 et Windows 10, mais, comme je te l'ai dit, le problème n'était pas là (prendre trop de temps pour exécuter la méthode ne fait qu'introduire de latence et du gel dans l'UI, pas des dysfonctionnements durables, à moins d'un temps vraiment important pour charger l'image et construire la texture (qui ferait qu'on voit le fond dirty du contexte graphique, pendant ce temps, avant qu'il ne soit redessiné proprement)). Ce n'est pas impossible, mais c'est surprenant, donc ça demande un peu plus d'investigations (au moins un coup de chrono).
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 265
    Par défaut
    Effectivement j'ai eu la même interrogation. A part le fait de créer une classe indépendante pour le panneau, je ne voyais pas pourquoi cela réglerait le problème. C'est pour cela que j'avais souhaité faire des tests plus longtemps et plus exhaustifs
    .
    IL n'est pas impossible que le temps soit un paramètre majeur dans ce qui arrive. En effet entre Windows 8.1 et Windows 10 la grande différence (outre l'OS) c'est la vitesse du processeur sur cet ordinateur et surtout de la carte graphique qui est spécialisée pour des jeux. Sans cela je ne vois pas d'où cela pourrait vernir car le code que je t'ai montré est le seul endroit où je surcharge paintComponent. Une autre idée que j'ai, serait de la façon donc chaque onglet du panneau est créé et rafraichi. Je vais chercher de ce côté mais je n'y crois pas vraiment. Chaque onglet est définit de la façon suivante.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    	tabbedPane = new JTabbedPane(JTabbedPane.TOP);
    			tabbedPane.setForeground(Color.BLACK); 
    			tabbedPane.setBounds(10, 97, 993, 408);
    			tabbedPane.setFont( new Font( "arial", Font.PLAIN, 11 ) );
    			tabbedPane.setBorder(compound); 
    			tabbedPane.insertTab("Identité", null,Identité, null,INDEX_Identité);  // onglet identité.
                                -------------------
     
     
                             MonPanneau = new TexturedPanel();
    			MonPanneau.setLayout(null);
    			MonPanneau.setBounds(10, 11, 1013, 576);
                            MonPanneau.add(tabbedPane);
                           this.getContentPane().add(MonPanneau);
    où "Identité" est une classe indépendante définie tout simplement de la façon suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
                          public class MCB_Saisie_Identité extends javax.swing.JPanel  
                           {
                                       ------
                             }

    Bien sûr si tu constates quoi que ce soit d'anormal, n'hésite pas à me le dire.
    Merci encore et Bonne journée.

    Gégé

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

Discussions similaires

  1. [Turbo Pascal] Affichage graphique sous Windows 7
    Par didos55 dans le forum Turbo Pascal
    Réponses: 4
    Dernier message: 22/04/2013, 12h08
  2. Réponses: 4
    Dernier message: 04/10/2011, 11h28
  3. Problème d'affichage dans des TScrollBox sous Windows Vista
    Par ILPlais dans le forum Composants VCL
    Réponses: 1
    Dernier message: 28/05/2008, 10h09
  4. [MySQL] Affichage de messages d'erreur sous Windows
    Par souadmaa dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 28/01/2008, 14h13
  5. [VB.NET2003] : Problème affichage sous Windows 98
    Par alkponn dans le forum Windows Forms
    Réponses: 2
    Dernier message: 13/10/2005, 16h34

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