Ich versuche, eine JScrollPane mit einem JTextArea zu implementieren. Die JTextArea wird angefügt, und ich möchte, dass JScrollPane immer weiter scrollt, wenn mehr Text hinzugefügt wird. Wie kann dies erreicht werden?Eine JScrollPane automatisch scrollen ganz nach unten
Antwort
Für (was ich denke, ist) eine einfachere Antwort check out: Text Area Scrolling.
Vor JDK5 mussten Sie die Position des Carets nach jedem Anhängen manuell ändern. Sie können nun dieses Verhalten als Standard wie folgt geben:
JTextArea textArea = new JTextArea(); DefaultCaret caret = (DefaultCaret)textArea.getCaret(); caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);
Der Vorteil ist, dass Sie diese Schnipsel mehr als einmal nicht in Ihrem Code verwenden müssen!
fand ich die Antwort hier: JScrollPane and JList auto scroll
scrollPane.getVerticalScrollBar().addAdjustmentListener(new AdjustmentListener() {
public void adjustmentValueChanged(AdjustmentEvent e) {
e.getAdjustable().setValue(e.getAdjustable().getMaximum());
}
});
Ihre "Lösung" ist eigentlich das Problem der Frage verknüpft: Wenn Sie manuell zu bewegen versuchen der vertikale Scroll-Griff, scrollt dieser Code wieder nach unten! – jackrabbit
Eine Umgehung ist möglich: Sie können diesen Listener als eine Klasse deklarieren und dann für das Ereignis instanziieren, wo er benötigt wird. Danach können Sie die Klasse entfernen, nachdem Sie ein Bild neu gezeichnet haben. Klappt wunderbar.
Wenn Sie ständig Daten zu schreiben sind, um es könnten Sie:
textArea.setCaretPosition(textArea.getDocument().getLength());
nur, nachdem Sie die neuen Daten hinzufügen.
Dies würde automatisch den gesamten JScorllPane hinunterrollen.
Während es möglich ist, ist es nicht die beste Lösung - das ist die Antwort von @camickr :-) – kleopatra
+1 für gute Arbeit. –
Hier ist die Lösung.
JTextArea textArea = new JTextArea();
DefaultCaret caret = (DefaultCaret)textArea.getCaret();
caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);`
Dies ist nur Code, keine Beschreibung, daher keine Antwort. –
+1 für die richtige Antwort - obwohl es das gleiche wie die Robs akzeptierte Antwort ist :-) – kleopatra
(PS: Edit 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);
}
}
+1 Die 'setUpdatePolicy()' API erklärt _so_ viel. Ich habe meine Antwort auf die zitierte Frage entsprechend aktualisiert. – trashgod
Ja, die API ändert sich ständig, um mit den Änderungen Schritt zu halten. – camickr
Dies hilft, aber wenn der Benutzer irgendwo anders als nach dem Ende der letzten Zeile klickt, stoppt das automatische Scrollen. Das ist nicht intuitiv. Es wäre schön, wenn das übliche Verhalten funktioniert, nur durch Scrollen nach unten wird das automatische Scrollen wieder aktiviert. – jcalfee314