it-swarm.dev

Wie kann man AUTO-SCROLLING von JTextArea in Java GUI einstellen

Ich habe eine JTextArea in ein JScrollPane eingebettet und verwende diese JTextArea für die Ausgabe.

Ich möchte, dass das JTextArea-Bild automatisch gescrollt wird, wenn der Ausgang über die Größe von JTextArea hinausgeht, sodass der Benutzer nicht manuell nach unten scrollen muss, um die aktuelle Ausgabe zu sehen.

Wie kann ich das machen?

Ich habe die Autoscroll-Eigenschaft von JTextArea und JScrollPane bereits auf true festgelegt.

63
Yatendra Goel

Bei der Verwendung von JDK1.4.2 (oder früher) wird der häufigste Vorschlag, den Sie in den Foren finden, die Verwendung von Code wie folgt:

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

Ich habe jedoch gerade bemerkt, dass dieses Problem in JDK5 durch eine API-Änderung tatsächlich behoben wurde. Sie können dieses Verhalten jetzt steuern, indem Sie eine Eigenschaft für das DefaultCaret des Textbereichs festlegen. Bei diesem Ansatz wäre der Code:

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

Eine ausführlichere Beschreibung dieses Themas finden Sie hier: Textbereich scrollen

142
camickr

Wenn Sie auf eine beliebige Stelle über JTextArea klicken, kann der automatische Bildlauf angehalten werden. Da sich die Position der Einfügemarke einmal geändert hat, hat sich auch der Blickwinkel geändert. In dieser Zeit sollten Sie die Caret-Position festlegen, wenn Sie Text anfügen oder hinzufügen. Auf meinem Weg habe ich eine Methode erstellt, die die Caret-Position festgelegt hat, und dann, wenn etwas hinzugefügt oder angehängt werden soll.

2
Juntae
    JScrollBar vbar = scrollPane.getVerticalScrollBar();

    for (int i = 0; i < 20; i++) {

        myJTxt.append("This is text " + i + "\n");
        vbar.setValue(vbar.getMaximum());
        vbar.Paint(vbar.getGraphics());
        myJTxt.scrollRectToVisible(myJTxt.getVisibleRect());
        myJTxt.Paint(myJTxt.getGraphics());
        try {
            Thread.sleep(250);
        } catch (InterruptedException ex) {
            Logger.getLogger(ScrollTextView.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
2
user211233
    JTextArea jTextArea = new JTextArea();
    DefaultCaret caret = (DefaultCaret)jTextArea.getCaret();
    caret.setUpdatePolicy(DefaultCaret.OUT_BOTTOM);
1
kayz1

Ich habe die meisten Vorschläge ausprobiert, stieß jedoch auf Probleme, wenn der Inhalt der JTextArea groß wird (mehrere MB). Schließlich zeigte das Folgende die beste Leistung:

myTextArea.append( someText );
myTextArea.getCaret().setDot( Integer.MAX_VALUE );

Natürlich geht jede Auswahl, die der Benutzer getroffen hat, verloren. Daher ist es nur für eine "Nur-Anzeige" -Verwendung des Textbereichs verwendbar.

In meiner Installation wird der Inhalt der JTextArea-Datei jedoch immerhin 9 MB überschreiten und wird dadurch unbrauchbar (sehr träge bis fast eingefrorene GUI).

Ein ähnliches Phänomen tritt auf, wenn der Text Zeichen enthält, die in der UTF-16-Kodierung durch zwei Zeichen (zwei 16-Bit-Einheiten) dargestellt werden (sogenannte Surrogat-Paare, z. Ich habe eine Lösung zum Filtern, aber vielleicht ein anderes Thema.

0
HAig