這是一段可運行的代碼,顯示了我的「問題」。我有一個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