Swing Scrollpanes: wie kann ich durch Java-Code an den "Anfang" scrollen

SilencerandLois

Aktives Mitglied
Hallo zusammen,
eigentlich ein triviales Thema, aber ich krieg es nicht gebacken ???:L

Ich habe ein JTextArea-Field, welches in eine Scrollpane gebettet ist. Die Scrollpane funktioniert auch eigentlich korrekt. Soweit so gut.
Nun habe ich aber das "seltsame" Verhalten, dass nach der Befüllung des Textfeldes mit einem längeren Text automatisch an das Ende des Textes gescrollt werden. In meinem Anwendungsfall sollte aber nicht bis zum Ende gescrollt werden, sondern zum Anfang.

Ich habe bereits versucht, mit
Java:
getScrollPane().getHorizontalScrollBar().setValue(0);
wieder an den Anfang zu springen. Hat jedoch nichts gebracht.

Besten Dank für eure Hilfe!

Viele Grüße,
Martin
 
Pfui, bloß nicht solche Würgarounds verwenden. :shock:

Probier es mal hiermit:
Java:
import java.awt.Dimension;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;
import javax.swing.text.DefaultCaret;

public class StayingCaret {
	public static void main(final String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			@Override
			public void run() {
				final JFrame f = new JFrame();
				final JTextArea a = new JTextArea();
				((DefaultCaret) a.getCaret()).setUpdatePolicy(DefaultCaret.NEVER_UPDATE); // voilà
				final JScrollPane p = new JScrollPane(a);
				p.setPreferredSize(new Dimension(300, 300));
				f.setContentPane(p);
				f.pack();
				f.setLocationRelativeTo(null);
				f.setVisible(true);
				new Thread(new Runnable() {
					@Override
					public void run() {
						try {
							while (true) {
								Thread.sleep(100);
								SwingUtilities.invokeLater(new Runnable() {
									@Override
									public void run() {
										a.append("Hallo, Welt!\n");
									}
								});
							}
						} catch (final InterruptedException e) {
							e.printStackTrace();
						}
					}
				}).start();
			}
		});
	}
}
 
Hi Xehpuk,
wenn ich deinen Post richtig verstehe ist folgende Zeile die ausschlaggebende:
Java:
((DefaultCaret) a.getCaret()).setUpdatePolicy(DefaultCaret.NEVER_UPDATE); // voilà

Sehe ich das richtig?

Besten Dank und viele Grüße,
Martin
 
Moin,

Hi Xehpuk,
wenn ich deinen Post richtig verstehe ist folgende Zeile die ausschlaggebende:
Java:
((DefaultCaret) a.getCaret()).setUpdatePolicy(DefaultCaret.NEVER_UPDATE); // voilà

Sehe ich das richtig?
jau, so ist das 😉

Klick' mal einfach links daneben auf das unterstrichene "DefaultCaret", dann kommst Du zur entsprechenden API, wo das auch erklärt wird !

Gruß
Klaus
 
Hallo zusammen,
ich werde mir einmal beide Funktionalitäten genauer ansehen und antesten. Im Anschluss kann ich entscheiden, welche Lösung besser meinen Bedürfnissen entspricht 🙂


Besten Dank für die angeregte Diskussion!
Viele Grüße,
Martin
 
Naja, Workaround ist wohl Ansichtssache ;-)
Was, wenn das Textfeld als Editor verwendet werden soll - der Anwender wird sich für das Verhalten bedanken ;-)
Ich würde fluchen, wenn sich das Caret selbstständig machte.

Das
Code:
NEVER_UPDATE
hat jedoch den Effekt, dass das Caret sich gar nicht mehr bewegt, also auch nicht bei Benutzereingaben. Daher ist es besser, wenn man den Default (
Code:
UPDATE_WHEN_ON_EDT
) lässt und
Code:
append(String)
nicht im EDT aufruft:
Java:
import java.awt.Dimension;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;

public class Main {
	public static void main(final String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			@Override
			public void run() {
				final JFrame f = new JFrame();
				final JTextArea a = new JTextArea();
				final JScrollPane p = new JScrollPane(a);
				p.setPreferredSize(new Dimension(300, 300));
				f.setContentPane(p);
				f.pack();
				f.setLocationRelativeTo(null);
				f.setVisible(true);
				new Thread(new Runnable() {
					@Override
					public void run() {
						try {
							while (true) {
								Thread.sleep(100);
								a.append("Hallo, Welt!\n");
							}
						} catch (final InterruptedException e) {
							e.printStackTrace();
						}
					}
				}).start();
			}
		});
	}
}
 

Zurück
Oben