Java / Swing: JTextArea in einem JScrollPane, wie verhindert man das automatische Scrollen?
hier ist ein ausführbarer Code, der zeigt, was mein "Problem" ist.
Ich habe einJTextArea
eingewickelt in einJScrollPane
. Wenn ich den Text des @ ändeJTextArea
, dasJScrollPane
scrollt automatisch zum Ende des Textes und ich möchte das nicht.
Hier sind meine Anforderungen:
die Anwendungsollte nich automatisch vertikal scrollen, aber ...der Benutzersollt in der Lage sein, vertikal zu scrollender Benutzersollte nichn der Lage sein, horizontal zu scrolldie Anwendungsollte ni horizontal scrollendie JTextArea darf nicht editierbar sein(Auch wenn mehr Text vorhanden ist als horizontal passen kann, sollten weder die Anwendung noch der Benutzer in der Lage sein, einen horizontalen Bildlauf durchzuführen. Während der vertikale Bildlauf nur vom Benutzer ausgeführt werden kann.)
Ich weiß nicht, wie ich das "beheben" soll: Sollte dies mit @ behoben werdJTextArea
oderJScrollPane
Methoden?
Beachten Sie, dass AFAICT dies istnich ein Duplikat von:JTextPane verhindert das Scrollen im übergeordneten JScrollPane
Ist hier das ein bisschen lustige Beispiel, alle 200 ms setzt es neuen Text in dasJTextArea
und Sie können das @ sehJScrollPane
immer automatisch ans Ende des Textes scrollen.
import javax.swing.*;
import java.awt.*;
import java.util.Random;
public final class TextInScrollPane extends JFrame {
private static final Random r = new Random( 42 );
public static void main( final String[] args ) {
final JFrame f = new JFrame();
f.setDefaultCloseOperation( EXIT_ON_CLOSE );
f.setLayout(new BorderLayout());
final JTextArea jta = new JTextArea( "Some text", 30, 30 );
jta.setEditable( false ); // This must not be editable
final JScrollPane jsp = new JScrollPane( jta );
jsp.setHorizontalScrollBarPolicy( JScrollPane.HORIZONTAL_SCROLLBAR_NEVER );
jsp.setVerticalScrollBarPolicy( JScrollPane.VERTICAL_SCROLLBAR_ALWAYS );
f.add( jsp, BorderLayout.CENTER );
f.pack();
f.setLocationRelativeTo( null );
f.setVisible(true);
final Thread t = new Thread( new Runnable() {
public void run() {
while ( true ) {
try {Thread.sleep( 200 );} catch ( InterruptedException e ) {}
final StringBuilder sb = new StringBuilder();
for (int i = 0; i < 50 + r.nextInt( 75 ); i++) {
for (int j = 0; j < r.nextInt(120); j++) {
sb.append( (char) 'a' + r.nextInt(26) );
}
sb.append( '\n' );
}
SwingUtilities.invokeLater( new Runnable() {
public void run() {
jta.setText( sb.toString() );
}
} );
}
}
});
t.start();
}
}