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

Composants Java Discussion :

Pb append dans une TextArea à partir d'un autre Thread


Sujet :

Composants Java

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 4
    Par défaut Pb append dans une TextArea à partir d'un autre Thread
    Bonjour à tous,

    Je développe une interface Swing qui permet de se connecter en Telnet sur un serveur AIX distant et d'exécuter des commandes

    La connexion Telnet fonctionne impec avec (org.apache.commons.net.telnet.TelnetClient) et lors des tests je récupère bien sur la console le telnet.getInputStream(), ce qui me permet de voir les commandes passées et le détail de l'exécution

    Mon souci est que je voudrais que l'affichage se fasse dans une JTextArea, et ca marche ... à moitié seulement ...

    Pour cela, avec les infos trouvées sur ce forum, j'exécute le lancement de la connexion Telnet dans un Thread séparé, et pour la mise à jour de ma JTextArea, j'utilise une méthode Runnable, qui fait un "append" avec le texte passé en paramétre :

    Classe Action dans mon Thread graphique :

    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
    public void actionPerformed(ActionEvent arg0) {
    	final String environnement = fenetre.getListe_env_was().getSelectedItem().toString();
    		final MajTextArea maj = new MajTextArea(fenetre.getZoneDeTexte());
     
    		Thread t = new Thread() {
    			public void run(){
    				TelnetWrapper telnet = new TelnetWrapper();
    				telnet.setMajTextArea(maj);
    				telnet.setPrompt("$");
    				telnet.setPromptLogin("Connexion :");
    				telnet.setPromptPwd("Mot de passe de "+Constantes.telnet_login+" :");
    				telnet.Connexion(Constantes.ip_dmgr,new Integer(Constantes.telnet_port).intValue(),Constantes.telnet_login,Constantes.telnet_pwd);
    				//String cmd = "".replaceAll("regxx", nomEnvironnement);
    				//telnet.sendCommand(cmd);
    				telnet.disconnect();
    			}
    		};
    		t.start();
     
    	}
    Extrait classe outils Telnet :

    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
    public String readUntil(String pattern) {
    		try {
    			char lastChar = pattern.charAt( pattern.length() - 1 );
    			StringBuffer sb = new StringBuffer();
    			boolean found = false;
    			//in = telnet.getInputStream();
    			char ch = (char)in.read();
    			while(true) {
    				//OK sur la sortie standard
    				System.out.print(ch);
     
    				//KO en utilisant SwingUtilities
    				majTextArea.setText(Character.toString(ch));
    				SwingUtilities.invokeAndWait(majTextArea);
     
    				sb.append(ch);
    				if(ch == lastChar) {
    					if(sb.toString().endsWith(pattern)) {
    						return sb.toString();
    					}
    				}
    				ch = (char)in.read();
    			}
    		} catch(Exception e) {
    			e.printStackTrace();
    		}
    		return null;
    	}
    Sur la sortie "System.out", c'est Ok mais à un moment les append sur ma JtextArea s'arrêtent, si je fait du Debug, sa semble s'arrpeter lorsque les caractères sont une suite de "\r" et "\n"

    Après avoir lu sur ce forum que la méthode append de JTextArea était "ThreadSafe", j'ai remplacé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    majTextArea.setText(Character.toString(ch));
    	  SwingUtilities.invokeAndWait(majTextArea);
    par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    textArea.append(Character.toString(ch));
    Même résultat ...

    Avez vous une solution à mon pb ?

    D'avance merci

    Cordialement

  2. #2
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 4
    Par défaut Désolé ...
    En fait, Ca marche ... mon problème était masqué par un autre ...

    Ma JtextArea se rafraichit bien mais le scrolling vertical automatique ne fonctionne pas, voici le code d'implémentation :
    private void build() {
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    zoneDeTexte = new JTextArea();
    		zoneDeTexte.setPreferredSize(new Dimension(660,750));
    		zoneDeTexte.setEditable(false);
    		zoneDeTexte.setLineWrap(true);
    		zoneDeTexte.setFont(this.getPolice());
    		zoneDeTexte.setForeground(Color.LIGHT_GRAY);
    		zoneDeTexte_scrolling = new JScrollPane(zoneDeTexte,JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
    ...
    }
    public JPanel buildContentPaneInstallerPaquets() {
    ...
    panelInstallerPaquets.add(this.getZoneDeTexte_scrolling());
     
    ...}
    Pouvez-vous m'aider ?

    Merci d'avance

    Cordialement

  3. #3
    Membre émérite Avatar de fraco
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2006
    Messages : 750
    Par défaut
    mettre le caret à la fin ?
    du genre textArea.setCaretPosition(....)

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 4
    Par défaut Essais ...
    A l'endroit où je fais mon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    textArea.append("mon texte")
    J'ai testé avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SwingUtilities.invokeLater(new Runnable() {
    			        public void run() {
    			        	textArea.setCaretPosition(textArea.getText().length());
     
     
    			        }
    			      });
    puis avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SwingUtilities.invokeLater(new Runnable() {
    			        public void run() {
    try {
    							scrollPane.scrollRectToVisible(textArea.modelToView(textArea.getText().length()));
     
    						} catch (javax.swing.text.BadLocationException err) {
     
    						}
     }
    			      });
    Et Toujours pas de scrolling vertical

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 4
    Par défaut Ca y est
    Ca marche, j'ai mis en commentaire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    //zoneDeTexte.setPreferredSize(new Dimension(660,750));
    Merci


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

Discussions similaires

  1. Réponses: 2
    Dernier message: 23/01/2015, 17h28
  2. placer un texte dans une textarea en cliquant sur un bouton
    Par BernardT dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 14/11/2005, 17h17
  3. Réponses: 14
    Dernier message: 22/09/2005, 16h49
  4. [MySQL] Comment ecrire dans une BDD à partir d'un tableau ?
    Par weed dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 16/09/2005, 15h53
  5. Réponses: 2
    Dernier message: 15/06/2005, 17h32

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