10

これは、私の「問題」が何であるかを示す実行可能なコードです。

JTextAreaラップされていJScrollPaneます。のテキストを変更すると、テキストの最後まで自動的JTextAreaJScrollPaneスクロールされますが、それは望ましくありません。

ここに私の要件があります:

  • アプリケーションは自動的に垂直方向にスクロールするべきではありませんが...
  • ユーザーは垂直方向にスクロールできる必要があります
  • ユーザーが水平方向にスクロールできないようにする
  • アプリケーションは決して水平方向にスクロールしないでください
  • JTextArea は編集可能であってはなりません

(したがって、水平方向に収まりきらないほど多くのテキストがある場合でも、アプリケーションもユーザーも水平方向にスクロールできないはずです。垂直方向にスクロールできるのはユーザーだけです。)

これを「修正」する方法がわかりません。JTextAreaまたはJScrollPaneメソッドを使用して修正する必要がありますか?

AFAICT これはまったく重複していないことに注意してください: JTextPane は親 JScrollPane でスクロールを防止します

ちょっと面白い例を次に示します。200 ミリ秒ごとに新しいテキストが挿入され、常にテキストの最後まで自動的にスクロールJTextAreaすることがわかります。JScrollPane

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

}
4

3 に答える 3

26

Java GUI で JTextArea の AUTO-SCROLLING を設定するには?

http://download.oracle.com/javase/1.5.0/docs/api/javax/swing/text/DefaultCaret.html#NEVER_UPDATE

試す:

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

これにより、キャレットがドキュメントを自動的に下にスクロールするのを防ぐ必要があります。

于 2010-10-19T21:53:52.587 に答える
1

Document クラスの実装で非常に奇妙な動作に遭遇しました。JScrollPane 内の JTextPane で DefaultStyledDocument を使用します。

さて、ここに奇妙なことがあります。EventQueue のドキュメントを更新すると (ランナブルを後で実行するようにスケジュールする場合と同様)、スクロール ペインは自動的に最後までスクロールします。

ただし、ドキュメント クラスは、スレッド セーフであり、実際には別のスレッドから更新可能であると主張しています。EventQueue 以外の別のスレッドで必ず更新すると、すべて正常に動作しますが、スクロール ペインは最後までスクロールしません。

なぜそうなのかについては説明がありません。Swing のソースを調べていません。私は2006年からこの「機能」を利用してきましたが、これまでのところ一貫しています:-)

于 2011-03-08T09:18:50.583 に答える
1

私自身の質問に答える:これが私の問題を解決するための最良の方法であるかどうかは正確にはわかりませんが、JTextArea's使用してキャレットを設定するsetCaretPosition(0)とうまくいくようです:

jta.setText( sb.toString() );
jta.jta.setCaretPosition( 0 );
于 2010-10-19T20:25:51.967 に答える