web-dev-qa-db-fra.com

Faire un JScrollPane défiler automatiquement complètement

J'essaie d'implémenter un JScrollPane avec un JTextArea. JTextArea est ajouté à, et je veux que JScrollPane continue à faire défiler vers le bas à mesure que plus de texte est ajouté. Comment cela peut il etre accompli?

17
Krigath

Pour (ce que je pense est) une réponse plus simple consultez: Zone de texte défilement .

Avant JDK5, vous auriez à changer manuellement la position du curseur après chaque ajout. Vous pouvez maintenant donner ce comportement par défaut comme ceci:

 JTextArea textArea = new JTextArea();
 DefaultCaret caret = (DefaultCaret)textArea.getCaret();
 caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);

L'avantage est que vous n'avez pas besoin d'utiliser cet extrait plusieurs fois dans votre code!

37
camickr

J'ai trouvé la réponse ici: JScrollPane et JList auto scroll

scrollPane.getVerticalScrollBar().addAdjustmentListener(new AdjustmentListener() {  
        public void adjustmentValueChanged(AdjustmentEvent e) {  
            e.getAdjustable().setValue(e.getAdjustable().getMaximum());  
        }
    });
7
Krigath

Voici la solution.

JTextArea textArea = new JTextArea();
DefaultCaret caret = (DefaultCaret)textArea.getCaret();
caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);` 
6
Jeevan B. Manoj

Si vous écrivez constamment des données, vous pouvez utiliser:

textArea.setCaretPosition(textArea.getDocument().getLength());

juste après avoir ajouté les nouvelles données.

Cela ferait automatiquement défiler le JScorllPane.

6
Harold Martin

Un contournement est possible: vous pouvez déclarer cet écouteur en tant que classe puis l'instancier sur l'événement où il est nécessaire. Après quoi, vous pouvez supprimer la classe après avoir forcé une nouvelle peinture de l'écran. Fonctionne comme un charme.

1
Primark

Ma solution  Screen Shoot

Alternative SC Link (PS: Edit for SCREEN SHOOT)

import javax.swing.*;
import javax.swing.text.DefaultCaret;

public class NewClass {

    public static void main(String[] args) {
        JFrame win = new JFrame("test");
        win.setSize(800, 500);
        win.setResizable(false);
        win.setLayout(null);
        win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        win.setLocationRelativeTo(null);

        JTextArea txtListNum = new JTextArea();
        JScrollPane barList = new JScrollPane(txtListNum);
        DefaultCaret crList = (DefaultCaret) txtListNum.getCaret();
        crList.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);

        barList.setLocation(10, 10);  // Scrollbar Position
        barList.setSize(180, 450);   // Scrollbar Dimession
        win.add(barList);            // Scrolbar add to Frame

        win.setVisible(true);

    }

}
0
Yusuf Kalsen

La solution acceptée fonctionne bien, mais uniquement lorsque la zone de texte est modifiable, c’est-à-dire sans jTextArea.setEditable(false). La solution suggérée par Krigath est plus générale, mais présente le problème demandé ici JScrollPane et JList auto scroll . En utilisant les réponses à cette question, vous pouvez obtenir une solution générale, par exemple:

        JScrollPane scrollPane = new JScrollPane(jTextArea);

    verticalScrollBarMaximumValue = scrollPane.getVerticalScrollBar().getMaximum();
    scrollPane.getVerticalScrollBar().addAdjustmentListener(
            e -> {
                if ((verticalScrollBarMaximumValue - e.getAdjustable().getMaximum()) == 0)
                    return;
                e.getAdjustable().setValue(e.getAdjustable().getMaximum());
                verticalScrollBarMaximumValue = scrollPane.getVerticalScrollBar().getMaximum();
            });

Le volet ne défile alors que lorsque la barre de défilement verticale est développée, en réponse aux lignes de texte ajoutées.

Je reconnais qu’une méthode pour filtrer les événements sans variables supplémentaires pourrait être trouvée et apprécierais que quelqu'un la publie.

0
user9999