这是一段可运行的代码,显示了我的“问题”。我有一个JTextArea
包裹在JScrollPane
。当我更改JTextArea
的文本时,JScrollPane
会自动滚动到文本的末尾,我不希望这样。Java/Swing:一个JScrollPane中的JTextArea,如何防止自动滚动?
这里是我的要求:
- 应用不应该滚动自动垂直但是...
- 用户应该能够垂直滚动
- 用户不应该能够水平滚动
- 应用程序绝不应该水平滚动
- 的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();
}
}
note to all:有关空* catch *块和* final *的用法的注释可以发送到*/dev /空*,这真的不是这个问题是关于;) – SyntaxT3rr0r 2010-10-19 20:16:51