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 :

Mauvais affichage d'une JTextArea


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Développeur d'application
    Inscrit en
    Août 2006
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur d'application

    Informations forums :
    Inscription : Août 2006
    Messages : 21
    Par défaut Mauvais affichage d'une JTextArea
    Bonjour à tous,

    Je suis confrontée à un problème qui, je crois, est très ancien, mais qui, je suppose, a dû être résolu depuis longtemps avec les dernières versions de Java.
    Dans mon interface, je place un Panel contenant un jscrollpane contenant une jtextarea. Un petit extrait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    vue_trace = new JPanel();
    vue_trace.setLayout(new java.awt.BorderLayout());
    jsp1 = new JScrollPane();
    console = new JTextArea();
    console.setEditable(false);
    console.setRows(3);
    jsp1.setViewportView(console);
    vue_trace.add(jsp1, java.awt.BorderLayout.CENTER);
    Cette jtextarea est destinée à tracer les opérations de l'utilisateur en appelant la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public void setConsole(String txt) {
            console.append(txt+"\n");
            console.validate();
            jsp1.validate();
    }
    Jusque-là tout va bien. Mais quand l'utilisateur fait défiler la scrollbar ou quand j'utilise le positionnement automatique avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    javax.swing.text.DefaultCaret caret = (javax.swing.text.DefaultCaret)console.getCaret();
    caret.setUpdatePolicy(javax.swing.text.DefaultCaret.ALWAYS_UPDATE);
    l'affichage du texte dans la jtextarea est tout pourri : les lignes se chevauchent, sont répétées 2 fois... Si on retaille manuellement la fenêtre l'affichage redevient correct. Mais je ne peux pas demander ça aux utilisateurs, je vais me faire lyncher! Il faudrait peut-être ajouter un listener sur la scrollbar? Mais ça me paraît compliqué...

    Y a t'il une solution simple, propre et rapide (parfaite, quoi!)?
    Merci de votre aide.
    Jacqueline

  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 : 56
    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,

    Je n'ai jamais constaté un tel problème depuis que je fais du Java, donc depuis la 1.3.

    J'ai reproduit à l'instant un ECM avec ton code où je ne vois pas ce dysfonctionnement :

    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
    public class JTextAreaConsole {
     
    	public static void main(String[] args) {
    			JFrame frame = new JFrame("Test");
     
    		JScrollPane jsp1 = new JScrollPane();
    		JTextArea console = new JTextArea();
    		console.setEditable(false);
    		console.setRows(3);
    		javax.swing.text.DefaultCaret caret = (javax.swing.text.DefaultCaret)console.getCaret();
    		caret.setUpdatePolicy(javax.swing.text.DefaultCaret.ALWAYS_UPDATE);
    		jsp1.setViewportView(console);
    		frame.add(jsp1, BorderLayout.CENTER);
     
    		JPanel buttons = new JPanel(new FlowLayout(FlowLayout.RIGHT));
    		JButton button = new JButton("Append text");
    		button.addActionListener(e->setConsole(console, "blahblah"));
    		buttons.add(button);
     
    		frame.add(buttons, BorderLayout.SOUTH);
     
     
    		frame.setSize(400,400);
    		frame.setLocationRelativeTo(null);
    		frame.setVisible(true);
     
     
    	}
     
    	private static void setConsole(JTextArea console, String txt) {
    		console.append(txt+"\n"); 
    	}
     
    }

    A noter que ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
            console.validate();
            jsp1.validate();
    Citation Envoyé par ioumino Voir le message
    Si on retaille manuellement la fenêtre l'affichage redevient correct.
    Un repaint() (au lieu des validate()) devrait corriger le problème, mais je pense qu'il se situe ailleurs, soit dans le code (comment est affiché vue_trace (quel layout, quel container, etc), ou d'autres parties de l'UI(par exemple, un détournement du contexte graphique (Graphics) ou du fonctionnement de l'EDT)), soit c'est c'est lié à une version d'OS ? Tu le constates sur quel OS ? Et la version de Java, c'est laquelle ?
    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 averti
    Profil pro
    Développeur d'application
    Inscrit en
    Août 2006
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur d'application

    Informations forums :
    Inscription : Août 2006
    Messages : 21
    Par défaut
    Bonjour Joel,

    Merci de t'intéresser à mon problème. Ci-joint une capture du résultat obtenu : la ligne 'Requested action: Cancel' est affichée 2 fois alors que je n'ai fait l'action qu'une fois et lorsque je retaille la fenêtre, elle n'est bien affichée qu'une fois.

    Le Panel vue_trace est contenu dans une frame qui contient d'autres Panels et dont le layout est un GridBagLayout:
    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
     
    frame_pilote = new JFrame();
    frame_pilote.getContentPane().setLayout(new java.awt.GridBagLayout());
    vue_trace = new JPanel();
    vue_trace.setLayout(new java.awt.BorderLayout());
    jsp1 = new JScrollPane();
    console = new JTextArea();
    console.setEditable(false);
    console.setRows(3);
    jsp1.setViewportView(console);
    vue_trace.add(jsp1, java.awt.BorderLayout.CENTER);
    java.awt.GridBagConstraints c = new java.awt.GridBagConstraints();
    c.gridw = java.awt.GridBagConstraints.REMAINDER;
    c.fill = java.awt.GridBagConstraints.BOTH;
    c.weighty = 0.5;
     
    frame_pilote.getContentPane().add(vue_trace,c);
    J'ai supprimé le validate() de jsp1 complètement inutile. Le repaint() à la place du validate() n'a pas plus d'effet (j'avais d'ailleurs commencé par faire un repaint() avant de mettre validate() au vu des remarques glanées sur le Net).

    Bizarrement la piste de l'environnement est plus prometteuse. En effet, le problème se produit sur mon serveur de dev et pas sur mon serveur de prod. Cependant, ils ont tous les deux le même système (CentOS release 6.9); la commande uname -a rend pour tous les 2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Linux ... 2.6.32-696.30.1.el6.x86_64
    . Mais je ne sais pas s'ils ont tous les 2 les mêmes patches, je vais me renseigner auprès de l'équipe système.

    Ils ont tous les 2 la même version de java.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    java version "1.7.0_09"
    Java(TM) SE Runtime Environment (build 1.7.0_09-b05)
    Java HotSpot(TM) 64-Bit Server VM (build 23.5-b02, mixed mode)
    Dans un sens, si ça ne se produit pas en prod, ça m'arrange, mais je ne voudrais pas avoir un bug latent qui va ressortir un jour sans crier gare. Pour info, je travaille sur mon PC via l'émulateur NX pour me connecter aux serveurs Linux, ce qui peut aussi avoir des effets de bord.

    A+
    Jacqueline
    Images attachées Images attachées  

  4. #4
    Membre averti
    Profil pro
    Développeur d'application
    Inscrit en
    Août 2006
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur d'application

    Informations forums :
    Inscription : Août 2006
    Messages : 21
    Par défaut Ce n'est pas un problème Java
    Bonjour Joel,

    Tu avais raison: ce n'est pas un problème Java! C'est bien mon émulateur NX qui cause ce dysfonctionnement: sur le premier serveur sur lequel je me loggue avec NX, le mauvais affichage se produit, que ce soit le serveur de dev, le serveur de prod ou un autre serveur; si dans ce même environnement je me loggue sur un autre serveur via ssh -X, l'affichage est correct. Aucun problème si j'utilise l'émulateur MobaXterm ou un TX.

    Ceci dit, ce n'est pas la première fois que j'ai des comportements erratiques des interfaces graphiques sous NX. Mais c'est un autre sujet: je clos donc celui-ci.

    Merci de ton aide.
    Jacqueline

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

Discussions similaires

  1. Mauvais affichage de DIV d'une page à une autre
    Par ickyknox dans le forum Mise en page CSS
    Réponses: 10
    Dernier message: 19/12/2012, 18h22
  2. affichage d'un document ".doc" dans une JTextArea
    Par midoscofield dans le forum Composants
    Réponses: 10
    Dernier message: 02/06/2009, 21h22
  3. mauvais rafraichissement d'une JTextArea
    Par Nicool dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 13/11/2007, 15h26
  4. Réponses: 5
    Dernier message: 29/01/2007, 15h33
  5. Mauvais affichage d'une liste déroulante
    Par auriolbeach dans le forum Access
    Réponses: 3
    Dernier message: 18/06/2006, 12h10

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