これは、私の「問題」が何であるかを示す実行可能なコードです。
にJTextArea
ラップされていJScrollPane
ます。のテキストを変更すると、テキストの最後まで自動的JTextArea
にJScrollPane
スクロールされますが、それは望ましくありません。
ここに私の要件があります:
- アプリケーションは自動的に垂直方向にスクロールするべきではありませんが...
- ユーザーは垂直方向にスクロールできる必要があります
- ユーザーが水平方向にスクロールできないようにする
- アプリケーションは決して水平方向にスクロールしないでください
- 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();
}
}