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

}

Antworten auf die Frage(6)

Ihre Antwort auf die Frage