【发布时间】:2010-01-11 01:07:28
【问题描述】:
我有一个 JScrollPane,它的视口设置为 JTextArea。
我大约每秒更新一次 JTextArea 上显示的(多行)文本。每次文本更新时,JScrollPane 都会一直到文本底部。
相反,我想找出当前显示为原始文本第一行的行号,并将该行作为文本更新时显示的第一行(或者如果新文本没有'没有那么多行,然后一直滚动到底部)。
我这样做的第一次尝试是获取当前插入符号的位置,根据该位置计算线,然后设置文本区域以显示该线:
int currentPos = textArea.getCaretPosition();
int currentLine = 0;
try {
for(int i = 0; i < textArea.getLineCount(); i++) {
if((currentPos >= textArea.getLineStartOffset(i)) && (currentPos < gameStateTextArea.getLineEndOffset(i))) {
currentLine = i;
break;
}
}
} catch(Exception e) { }
textArea.setText(text);
int newLine = Math.min(currentLine, textArea.getLineCount());
int newOffset = 0;
try {
newOffset = textArea.getLineStartOffset(newLine);
} catch(Exception e) { }
textArea.setCaretPosition(newOffset);
这几乎可以满足我的需求,但需要用户在文本区域内单击以更改插入符号的位置,以便滚动保持状态(这不太好)。
我将如何使用(垂直)滚动位置来代替?
【问题讨论】:
-
我刚刚意识到:JTextArea 处理自己的滚动!这可能破坏了我们控制嵌入 JScrollPane 的努力。
-
好的,我搞定了。查看我的更新 2。
标签: java user-interface swing