it-swarm.com.de

Wenn Sie ein JScrollPane erstellen, scrollen Sie automatisch ganz nach unten

Ich versuche, ein JScrollPane mit einer JTextArea zu implementieren. Die JTextArea wird angehängt, und ich möchte, dass das JScrollPane nach unten scrollen wird, wenn mehr Text hinzugefügt wird. Wie kann das erreicht werden?

17
Krigath

Für (was ich denke) eine einfachere Antwort gibt es hier: Text Area Scrolling .

Vor JDK5 müssen Sie die Position des Einfügemarken nach jedem Anfügen manuell ändern. Sie können dieses Verhalten jetzt als Standard festlegen:

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

Dies hat den Vorteil, dass Sie diesen Code nicht mehr als einmal in Ihrem Code verwenden müssen!

37
camickr

Ich habe die Antwort hier gefunden: JScrollPane und JList Auto Scroll

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

Hier ist die Lösung.

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

Wenn Sie ständig Daten darauf schreiben, können Sie Folgendes verwenden:

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

gleich nachdem Sie die neuen Daten hinzugefügt haben.

Dadurch wird automatisch das gesamte JScorllPane durchlaufen.

6
Harold Martin

Eine Problemumgehung ist möglich: Sie können diesen Listener als Klasse deklarieren und ihn dann bei dem Ereignis instanziieren, bei dem er benötigt wird. Danach können Sie die Klasse entfernen, nachdem Sie den Bildschirm neu gezeichnet haben. Klappt wunderbar.

1
Primark

Meine Lösung  Screen Shoot

Alternative SC Link (PS: Bearbeiten für 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

Die akzeptierte Lösung funktioniert gut, aber nur, wenn der Textbereich bearbeitet werden kann, d. H. Ohne jTextArea.setEditable(false). Die von Krigath vorgeschlagene Lösung ist allgemeiner, hat jedoch das Problem, wie hier JScrollPane und JList Auto Scroll gefragt. Mit Antworten auf diese Frage können Sie eine allgemeine Lösung erhalten, z. B .:

        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();
            });

Der Bereich wird dann nur nach unten gescrollt, wenn die vertikale Bildlaufleiste als Reaktion auf angehängte Textzeilen erweitert wird.

Ich gebe zu, dass eine Methode zum Filtern von Ereignissen ohne zusätzliche Variablen gefunden werden kann, und ich würde es begrüßen, wenn jemand es postet.

0
user9999