【发布时间】:2011-04-27 16:55:27
【问题描述】:
这是一段可运行的代码,它显示了我的“问题”是什么。
我有一个 JTextArea 包裹在一个 JScrollPane 中。当我更改 JTextArea 的文本时,JScrollPane 会自动滚动到文本的末尾,我不希望这样。
这是我的要求:
- 应用程序不应自动垂直滚动,但...
- 用户应该能够垂直滚动
- 用户不应该能够水平滚动
- 应用程序不应水平滚动
- JTextArea 不能编辑
(因此,即使文本多于水平方向,应用程序和用户都不能水平滚动。垂直方向时,只有用户可以滚动。)
我不知道如何“解决”这个问题:应该使用JTextArea 或JScrollPane 方法解决这个问题吗?
请注意,AFAICT 这不是重复的:JTextPane prevents scrolling in the parent 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();
}
}
【问题讨论】:
-
大家注意:关于空的catch块和final的用法的cmets可以发送到/dev/null i>,这真的不是这个问题的意思;)
标签: java swing jscrollpane jtextarea