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 :

Auto-scroll JTextArea Swing


Sujet :

Composants Java

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2012
    Messages : 10
    Points : 8
    Points
    8
    Par défaut Auto-scroll JTextArea Swing
    Bonjour à tous,

    Alors le titre parle de lui même : J'ai une JTextArea et j'aimerais qu'elle auto-scroll. J'ai essayé un nombre incalculable de chose dont les deux plus populaires avec le DefaultCaret et le setCaretPosition mais rien n'y fait, quand ça veut pas ça veut pas. Je pose la partie de mon code là si vous avez une idée se serait top parce que là je sèche total.

    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
    public Container MessageArea() {
     
       JPanel container = new JPanel();
       container.setBorder(BorderFactory.createTitledBorder("ToDoList"));
       BoxLayout layout = new BoxLayout(container, BoxLayout.Y_AXIS);
       container.setLayout(layout);
     
       container.setPreferredSize(new Dimension(500, 400));
       messageArea.setAlignmentX(Component.CENTER_ALIGNMENT);
       messageArea.setPreferredSize(new Dimension(20, 20));
       messageArea.setBorder(BorderFactory.createLineBorder(Color.black));
       container.add(messageArea);
     
       return container;
    }
     
    public Client() {
     
       // Elements de l'interface graphique.
       textField.setEditable(true);
       messageArea.setEditable(true);
     
       Container panel1 = Buttons();
       Container panel2 = MessageArea();
     
       Container contentPane = frame.getContentPane();
       contentPane.setLayout(new FlowLayout());
       contentPane.add(panel1);
       contentPane.add(panel2);
     
       frame.pack();
     
       messageArea.append("Bienvenue sur ToDoList\n\n");
       messageArea.setCaretPosition(messageArea.getDocument().getLength());
    [...]

  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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Il y a un moyen de le gérer automatiquement par le curseur (caret) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    DefaultCaret caret = (DefaultCaret)textComponent.getCaret();
    caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);
    Exemple :
    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 DemoAutoScroll {
     
    	public static void main(String[] args) {
     
    		JFrame frame = new JFrame("Démo");
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
    		JTextArea textComponent = new JTextArea();
     
    		frame.add(new JScrollPane(textComponent, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER));
     
    		frame.setSize(600, 400);
    		frame.setLocationRelativeTo(null);
    		frame.setVisible(true);
     
    		DefaultCaret caret = (DefaultCaret)textComponent.getCaret();
    		caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);
     
    		fill(textComponent);
     
    	}
     
    	private static void fill(JTextArea textComponent) {
    		while( true ) {
    			textComponent.append("blah blah\n");
    			try {
    				Thread.sleep(300);
    			} catch (InterruptedException e) {
    				break;
    			}
    		}
    	}
     
    }
    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
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2012
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    Bonjour,

    J'ai déjà essaye par ça mais sans succès. Peut-être l'utilise-je mal :

    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
    public Container MessageArea() {
     
    		JPanel container = new JPanel();
    		container.setBorder(BorderFactory.createTitledBorder("ToDoList"));
    		BoxLayout layout = new BoxLayout(container, BoxLayout.Y_AXIS);
    		container.setLayout(layout);
     
    		container.setPreferredSize(new Dimension(500, 400));
    		messageArea.setAlignmentX(Component.CENTER_ALIGNMENT);
    		messageArea.setPreferredSize(new Dimension(20, 20));
    		messageArea.setBorder(BorderFactory.createLineBorder(Color.black));
    		container.add(new JScrollPane(messageArea, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER));
    		DefaultCaret caret = (DefaultCaret)messageArea.getCaret();
    		caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);
    		return container;
    	}

  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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Normalement, ça devrait fonctionner. Donc soit tu t'attends à quelque chose qui n'est pas du auto-scrolling, ou que le contexte n'est pas celui nécessaire pour qu'il y ait auto-scroll avec DefaultCaret.ALWAYS_UPDATE. Ce paramètre définit que le JTextArea affiche toujours le curseur : donc si on ajoute à la fin, et qu'on ne la voit pas, le composant se positionne dans le scrollpane de manière à ce que cette fin soit visible. Si on ajoute au début, ou au milieu, ce sera respectivement ces positions qui seront rendues visibles. Bien sûr, si tout le texte est déjà visible, on ne voit rien se passer, puisque le curseur est déjà visible.

    Une autre voie est d'agir directement sur le scrollpane et le viewport, qui a l'avantage de fonctionner pour n'importe quel composant. Voici une implémentation (Rob Camick - https://tips4java.wordpress.com/2013/03/03/smart-scrolling/) :

    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
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    import java.awt.Component;
    import java.awt.event.*;
    import javax.swing.*;
    import javax.swing.text.*;
     
    /**
     *  The SmartScroller will attempt to keep the viewport positioned based on
     *  the users interaction with the scrollbar. The normal behaviour is to keep
     *  the viewport positioned to see new data as it is dynamically added.
     *
     *  Assuming vertical scrolling and data is added to the bottom:
     *
     *  - when the viewport is at the bottom and new data is added,
     *    then automatically scroll the viewport to the bottom
     *  - when the viewport is not at the bottom and new data is added,
     *    then do nothing with the viewport
     *
     *  Assuming vertical scrolling and data is added to the top:
     *
     *  - when the viewport is at the top and new data is added,
     *    then do nothing with the viewport
     *  - when the viewport is not at the top and new data is added, then adjust
     *    the viewport to the relative position it was at before the data was added
     *
     *  Similiar logic would apply for horizontal scrolling.
     */
    public class SmartScroller implements AdjustmentListener
    {
    	public final static int HORIZONTAL = 0;
    	public final static int VERTICAL = 1;
     
    	public final static int START = 0;
    	public final static int END = 1;
     
    	private int viewportPosition;
     
    	private JScrollBar scrollBar;
    	private boolean adjustScrollBar = true;
     
    	private int previousValue = -1;
    	private int previousMaximum = -1;
     
    	/**
             *  Convenience constructor.
             *  Scroll direction is VERTICAL and viewport position is at the END.
             *
             *  @param scrollPane the scroll pane to monitor
             */
    	public SmartScroller(JScrollPane scrollPane)
    	{
    		this(scrollPane, VERTICAL, END);
    	}
     
    	/**
             *  Convenience constructor.
             *  Scroll direction is VERTICAL.
             *
             *  @param scrollPane the scroll pane to monitor
             *  @param viewportPosition valid values are START and END
             */
    	public SmartScroller(JScrollPane scrollPane, int viewportPosition)
    	{
    		this(scrollPane, VERTICAL, viewportPosition);
    	}
     
    	/**
             *  Specify how the SmartScroller will function.
             *
             *  @param scrollPane the scroll pane to monitor
             *  @param scrollDirection indicates which JScrollBar to monitor.
             *                         Valid values are HORIZONTAL and VERTICAL.
             *  @param viewportPosition indicates where the viewport will normally be
             *                          positioned as data is added.
             *                          Valid values are START and END
             */
    	public SmartScroller(JScrollPane scrollPane, int scrollDirection, int viewportPosition)
    	{
    		if (scrollDirection != HORIZONTAL
    		&&  scrollDirection != VERTICAL)
    			throw new IllegalArgumentException("invalid scroll direction specified");
     
    		if (viewportPosition != START
    		&&  viewportPosition != END)
    			throw new IllegalArgumentException("invalid viewport position specified");
     
    		this.viewportPosition = viewportPosition;
     
    		if (scrollDirection == HORIZONTAL)
    			scrollBar = scrollPane.getHorizontalScrollBar();
    		else
    			scrollBar = scrollPane.getVerticalScrollBar();
     
    		scrollBar.addAdjustmentListener( this );
     
    		//  Turn off automatic scrolling for text components
     
    		Component view = scrollPane.getViewport().getView();
     
    		if (view instanceof JTextComponent)
    		{
    			JTextComponent textComponent = (JTextComponent)view;
    			DefaultCaret caret = (DefaultCaret)textComponent.getCaret();
    			caret.setUpdatePolicy(DefaultCaret.NEVER_UPDATE);
    		}
    	}
     
    	@Override
    	public void adjustmentValueChanged(final AdjustmentEvent e)
    	{
    		SwingUtilities.invokeLater(new Runnable()
    		{
    			public void run()
    			{
    				checkScrollBar(e);
    			}
    		});
    	}
     
    	/*
    	 *  Analyze every adjustment event to determine when the viewport
    	 *  needs to be repositioned.
    	 */
    	private void checkScrollBar(AdjustmentEvent e)
    	{
    		//  The scroll bar listModel contains information needed to determine
    		//  whether the viewport should be repositioned or not.
     
    		JScrollBar scrollBar = (JScrollBar)e.getSource();
    		BoundedRangeModel listModel = scrollBar.getModel();
    		int value = listModel.getValue();
    		int extent = listModel.getExtent();
    		int maximum = listModel.getMaximum();
     
    		boolean valueChanged = previousValue != value;
    		boolean maximumChanged = previousMaximum != maximum;
     
    		//  Check if the user has manually repositioned the scrollbar
     
    		if (valueChanged && !maximumChanged)
    		{
    			if (viewportPosition == START)
    				adjustScrollBar = value != 0;
    			else
    				adjustScrollBar = value + extent >= maximum;
    		}
     
    		//  Reset the "value" so we can reposition the viewport and
    		//  distinguish between a user scroll and a program scroll.
    		//  (ie. valueChanged will be false on a program scroll)
     
    		if (adjustScrollBar && viewportPosition == END)
    		{
    			//  Scroll the viewport to the end.
    			scrollBar.removeAdjustmentListener( this );
    			value = maximum - extent;
    			scrollBar.setValue( value );
    			scrollBar.addAdjustmentListener( this );
    		}
     
    		if (adjustScrollBar && viewportPosition == START)
    		{
    			//  Keep the viewport at the same relative viewportPosition
    			scrollBar.removeAdjustmentListener( this );
    			value = value + maximum - previousMaximum;
    			scrollBar.setValue( value );
    			scrollBar.addAdjustmentListener( this );
    		}
     
    		previousValue = value;
    		previousMaximum = maximum;
    	}
    }

    PS : ce que tu cherches à faire, ce ne serait pas faire défiler le texte en continu, des fois ?
    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
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2012
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    Alors en gros mon sujet c'est de créer un couple client-serveur en utilisant les sockets TCP/IP. Le serveur stocke une liste de tâches à faire. Le client lui envoi des commandes au serveur pour agir sur cette liste. Exemple pour ajouter une liste on envoi "TODO Tache_a_ajouter" et le serveur répond "10 OK" si tout va bien. Quand je reçois ce message de confirmation je fais un messageArea.append("tâche ajoutée avec succès"); sauf que dans mon cas quand j'arrive en bas de mon JTextArea, il continu a ajouter à la fin sauf que je ne peu plus rien voir puisque le scroll ne se fait pas. C'est clair ?

  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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Donc, c'est exactement ce que mon code fait. Et il fonctionne (si tu l'exécutes, tu pourras le constater). Je vois que dans ton ordre d'ajout tu ne mets pas de passage à la ligne : messageArea.append("tâche ajoutée avec succès");. Il faut bien évidemment ajouter un \n à la fin de ta chaîne, sinon il n'y aura qu'une seule ligne dans ton textarea (par défaut, il n'y a même pas de wrapping). Si tu ne déplaces pas le curseur, il ne devrait pas y avoir de problème. Tu peux éviter que le curseur soit déplacé par clic dans le textarea en le rendant non éditable textarea.setEditable(false)
    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
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2012
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    Voilà la partie du code qui définie le messageArea :

    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 Container MessageArea() {
     
    		JPanel container = new JPanel();
    		container.setBorder(BorderFactory.createTitledBorder("ToDoList"));
    		BoxLayout layout = new BoxLayout(container, BoxLayout.Y_AXIS);
    		container.setLayout(layout);
     
    		container.setPreferredSize(new Dimension(500, 400));
    		messageArea.setAlignmentX(Component.CENTER_ALIGNMENT);
    		messageArea.setPreferredSize(new Dimension(20, 20));
    		messageArea.setBorder(BorderFactory.createLineBorder(Color.black));
    		container.add(new JScrollPane(messageArea, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER));
    		DefaultCaret caret = (DefaultCaret)messageArea.getCaret();
    		caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);
    		return container;
    	}
     
     
     
        public Client() {
     
            // Elements de l'interface graphique.
            textField.setEditable(true);
            messageArea.setEditable(false);
     
    		Container panel1 = Buttons();
    		Container panel2 = MessageArea();
     
    		Container contentPane = frame.getContentPane();
    		contentPane.setLayout(new FlowLayout());
    		contentPane.add(panel1);
    		contentPane.add(panel2);
     
            frame.pack();
    J'ai apporté tes suggestions mais toujours le même résultats :
    Nom : Capture du 2015-04-27 16:45:25.png
Affichages : 1256
Taille : 30,8 Ko

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2012
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    Ah ! J'ai trouvé ! Le problème vient de la taille de mon JTextArea. Visiblement il n'apprécie pas que j'en définisse une en particulier.

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

Discussions similaires

  1. [XL-2002] Auto scroll avec pause
    Par Canidé dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 09/11/2011, 16h19
  2. [AC-2003] Faire un auto scroll dans un ListBox
    Par Hamadokh dans le forum IHM
    Réponses: 6
    Dernier message: 14/09/2009, 21h38
  3. Auto Scrolling JTextArea
    Par sirgzu dans le forum Composants
    Réponses: 1
    Dernier message: 04/08/2009, 12h05
  4. TREE_VIEW & Auto scrolling
    Par noumag dans le forum GTK+ avec C & C++
    Réponses: 10
    Dernier message: 07/08/2007, 15h12
  5. Auto-scroll d'une zone de texte multi ligne
    Par malek_dz77 dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 30/11/2005, 13h09

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