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 :

Descendre automatiquement un JscrollBar


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    287
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 287
    Par défaut Descendre automatiquement un JscrollBar
    Bonjour à tous,

    J'ai un programme qui effectue divers traitements et qui affiche dans un JTextArea la console. Vu le grand nombre de traitements et donc de renseignements affichés, j'ai placé cette JTextArea dans un JScrollPane. L'affichage se fait sans probléme mais le ScrollBar reste toujours en position haute.
    J'aimerais donc savoir comment faire en sorte que celui-ci descende en même temps que l'apparition de nouvelle données dans la zone de texte?

    Quelques morceaux de code

    Ma class GroupeSortieConsole, qui permet d'initialiser une partie de mon interface 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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    package principal.interfaces;
     
    import java.awt.Color;
    import java.awt.GridBagLayout;
     
    import javax.swing.BorderFactory;
    import javax.swing.JPanel;
    import javax.swing.JScrollBar;
    import javax.swing.JScrollPane;
    import javax.swing.JTextArea;
     
     
    public class GroupeSortieConsole {
    	private JTextArea jTextAreaSortieConsole;
    	private JPanel panSortieConsole;
    	private JScrollPane jScrollBar1;
    	public GroupeSortieConsole(){
     
     
    		//Configuration du Jpanel
    		panSortieConsole = new JPanel();
    		panSortieConsole.setBorder(BorderFactory.createTitledBorder("Sortie Console"));
    		panSortieConsole.setLayout(new GridBagLayout());
    		panSortieConsole.setBackground(Color.decode("#A3CCED"));
    		panSortieConsole.setVisible(true);
     
    		jTextAreaSortieConsole =  new JTextArea(15,150);
     
    		jScrollBar1 = new JScrollPane(jTextAreaSortieConsole);
     
    		panSortieConsole.add(jScrollBar1);
     
    	}
     
    	public JPanel getJPanel(){
    		return panSortieConsole;
    	}
     
    	public JTextArea getJTextArea(){
    		return jTextAreaSortieConsole;
    	}
     
    }
    et ma class Fenetre qui permet entres autres d'effectuer les traitements(ici simplifier)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    ...
    class jButtonValiderListener implements ActionListener{
    		public void actionPerformed(ActionEvent arg0) {
    			new Thread(new Runnable(){
    				public void run(){
    					for (int i=0;i<10000;i++){
    						System.out.println(i);
    					}
                                                 }
                                       }).start();
                            }...
    J'ai testé divers méthode mais sans obtenir le résultat escompté.

    Merci à vous

  2. #2
    Membre Expert
    Avatar de natha
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 346
    Par défaut
    Le plus simple dans ce cas est de jouer sur la JTextArea et non sur le JScrollPane.
    Par exemple moi je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    textArea.append(text);
    textArea.setCaretPosition(textArea.getText().length()); // TADA !!! ^^
    textArea.append("\n");
    J'ai testé divers méthode mais sans obtenir le résultat escompté.
    Ca serait sympa de préciser, histoire qu'on ne te donne pas les solutions que tu as essayé ou alors qu'on puisse corriger ce que tu as essayé.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    287
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 287
    Par défaut
    Alors effectivement quand je fais ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    for (int i=0;i<10000;i++){
         String text = String.valueOf(i);
         console.getJTextArea().setCaretPosition(console.getJTextArea().getText().length());
         console.getJTextArea().append(text + "\n");
    }					}
    cela m'a l'air de focntionner.

    Le probléme est que si je met
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
         console.getJTextArea().setCaretPosition(console.getJTextArea().getText().length());
         console.getJTextArea().append("\n");
    à la fin de mon véritbale traitement, cela ne fonctionne pas.

    Par contre, j'ai oublié de préciser que pour l'affichage de la console dans mon JTextArea je passe par deux classes (créées par des membres de ce forum) qui sont
    TextAreaOutputStream
    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
     
    package principal.traitements;
    import java.io.IOException;
    import java.io.OutputStream;
     
    import javax.swing.JTextArea;
     
    public class TextAreaOutputStream extends OutputStream
    {
      private JTextArea area;
     
      public TextAreaOutputStream( JTextArea area )
      {
        this.area = area;
      }
     
      @Override
      public void close() throws IOException {}
      @Override
      public void flush() throws IOException {
      }
     
      @Override
      public void write(byte[] b, int off, int len) throws IOException
      {
        area.append( new String( b, off, len ) );
      }
     
      @Override
      public void write(byte[] b) throws IOException
      {
        area.append( new String( b ));
      }
     
      @Override
      public void write(int b) throws IOException
      {
    	String a;
    	a = Integer.toString(b);
        area.append(a);
      }
    }
    et MultiOutputStream
    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
     
    package principal.traitements;
    import java.io.IOException;
    import java.io.OutputStream;
     
    public class MultiOutputStream extends OutputStream {
     
    	private final OutputStream[] streams;
     
     
    	public MultiOutputStream(OutputStream...args) {
    		this.streams = args.clone();
    	}
     
    	@Override
    	public void close() throws IOException {
    		for (OutputStream out : this.streams) {
    			out.close();
    		}
    	}
     
    	@Override
    	public void flush() throws IOException {
    		for (OutputStream out : this.streams) {
    			out.flush();
    		}
    	}
     
    	@Override
    	public void write(byte[] b, int off, int len) throws IOException {
    		for (OutputStream out : this.streams) {
    			out.write(b, off, len);
    		}
    	}
     
    	@Override
    	public void write(byte[] b) throws IOException {
    		for (OutputStream out : this.streams) {
    			out.write(b);
    		}
    	}
     
    	@Override
    	public void write(int b) throws IOException {
    		for (OutputStream out : this.streams) {
    			out.write(b);
    		}
    	}
    }
    avec l'appel dans ma classe Fenetre qui se fait ainsi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    TextAreaOutputStream sortieConsole = new TextAreaOutputStream(console.getJTextArea());
    			try {
    				System.setOut(new PrintStream(
    						new MultiOutputStream(System.out, new FileOutputStream("log.txt"),sortieConsole)
    						, true));
    			} catch (FileNotFoundException e) {
    				System.out.println("Fichier log.txt inexistant");
    			}

    bon je sais que ça fait beacoup de code mais je pense que c'est le minimum pour comprendre mon probléme.

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    287
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 287
    Par défaut
    Aprés une petite pause la réponse est apparu d'elle même :
    suffisait juste de faire un area.setCaretPosition(area.getText().length());. aprés chauqe append() dans la class TextAreaOutputStream!

    Merci pour ton aide natha

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

Discussions similaires

  1. AdvancedDataGrid descendre automatiquement
    Par fflo4ever dans le forum ActionScript 3
    Réponses: 0
    Dernier message: 13/04/2010, 10h15
  2. Descendre automatiquement / scrollbar
    Par defacta dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 04/01/2010, 22h47
  3. Descendre automatiquement d'une case en VBA
    Par NEC14 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 22/10/2008, 14h40
  4. faire descendre automatiquement un ascenseur WinAPI
    Par zoumoizou dans le forum Windows
    Réponses: 5
    Dernier message: 02/02/2008, 13h45
  5. Descendre automatique l'ascenseur de la scrollbar
    Par Jonathan.b dans le forum Balisage (X)HTML et validation W3C
    Réponses: 7
    Dernier message: 28/01/2008, 20h46

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