Frage

Ich habe eine jtextarea auf eine jScrollpane eingebettet und verwende diese jtextarea für die Ausgabe.

Ich möchte, dass wenn der OUPUT über die Größe der jTextArea hinausgeht, die JTextArea -Scrolls automatisch so scrollen, damit der Benutzer keine manuelle Scroll nach unten durchführen muss, um die jüngste Ausgabe anzuzeigen.

Wie kann ich das machen?

Ich habe die autoscroll -Eigenschaft von JTextArea und Jscrollpane bereits auf true eingestellt.

War es hilfreich?

Lösung

Bei Verwendung von JDK1.4.2 (oder früher) ist 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 tatsächlich durch eine API -Änderung gelöst wurde. Sie können dieses Verhalten nun steuern, indem Sie eine Eigenschaft auf dem StandardCaret des Textbereichs einstellen. Mit diesem Ansatz wäre der Code:

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

Notiz:

Der oben genannte Vorschlag, die Richtlinien für die Care -Update festzulegen, funktioniert nicht.

Stattdessen möchten Sie vielleicht auschecken Smart Scrolling Dies gibt dem Benutzer die Möglichkeit zu bestimmen, wenn das Scrollen automatisch sein sollte oder nicht.

Eine detailliertere Beschreibung des automatischen Scrollens in einem Textbereich finden Sie hier: Textbereich Scrollen

Andere Tipps

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

Wenn Sie über irgendwo über JTextArea klicken, ist das automatische Scrolling möglich, gestoppt zu werden. Da sich die Pflegeposition einmal geändert hat, änderte sich auch der Sichtpunkt. In dieser Zeit sollten Sie die Pflegeposition festlegen, wenn Sie einen Text anhängen oder hinzufügen. Auf meinem Weg machte ich eine Methode, einschließlich festgelegter Pflegeposition, und verwenden sie dann, wenn etwas hinzugefügt oder angehängt wird.

    JTextArea jTextArea = new JTextArea();
    DefaultCaret caret = (DefaultCaret)jTextArea.getCaret();
    caret.setUpdatePolicy(DefaultCaret.OUT_BOTTOM);

Ich habe die meisten Vorschläge ausprobiert, aber Probleme, wenn der Inhalt der jtextArea groß wird (mehrere MB). Schließlich zeigte Folgendes 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 Display" -Nutzung des Textbereichs verwendbar.

In meiner Installation wird der Inhalt der jTextArea, wenn er 9 MB überschreitet, ein bisschen unbrauchbar (sehr träge für fast gefrorene GUI).

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

Verwenden Sie dies stattdessen

JTextArea textArea = new JTextArea();
DefaultCaret caret = (DefaultCaret)textArea.getCaret();
caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);
scrollPane = new JScrollPane();
scrollPane.add(textArea);
scrollPane.setViewportView(textArea);

Versuche dies:

JTextArea jTextArea = new JTextArea();
JScrollPane jScrollPane = new JScrollPane();
jScrollPane.setViewport(jTextArea);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top