我试图在包含JTextPane的JScrollPane上自动滚动智能。 JTextPane用于以彩色记录我的应用程序。不过,我正在试图进行智能自动滚动。通过智能自动滚动,我并不是说每次有变化时都会盲目地自动滚动,我的意思是检查滚动是否一直下降,然后然后自动滚动。但是不管我做什么,要么总是autoscrolls或没有在所有智能JScrollPane自动滚动
作为测试脚本,这里的设置(JFrame中被忽略了)
final JTextPane textPane = new JTextPane();
textPane.setEditable(false);
final JScrollPane contentPane = new JScrollPane(textPane);
contentPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
和这里的丑自动添加测试循环
while (true)
try {
Thread.sleep(1000);
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
try {
JScrollBar scrollBar = scroll;
boolean preCheck = ((scrollBar.getVisibleAmount() != scrollBar.getMaximum()) && (scrollBar.getValue() + scrollBar.getVisibleAmount() == scrollBar.getMaximum()));
System.out.println("Value: " + scroll.getValue()
+ " | Visible: " + scrollBar.getVisibleAmount()
+ " | Maximum: " + scrollBar.getMaximum()
+ " | Combined: " + (scrollBar.getValue() + scrollBar.getVisibleAmount())
+ " | Vis!=Max : " + (scrollBar.getVisibleAmount() != scrollBar.getMaximum())
+ " | Comb=Max: " + (scrollBar.getValue() + scrollBar.getVisibleAmount() == scrollBar.getMaximum())
+ " | Eval: " + preCheck);
StyledDocument doc = textPane.getStyledDocument();
doc.insertString(doc.getLength(), "FAGAHSIDFNJASDKFJSD\n", doc.getStyle(""));
if (!preCheck)
textPane.setCaretPosition(doc.getLength());
} catch (BadLocationException ex) {
ex.printStackTrace();
}
}
});
} catch (Exception e) {
e.printStackTrace();
}
它并不漂亮,但它完成了工作。
这里虽然该检查
boolean preCheck = ((scrollBar.getVisibleAmount() != scrollBar.getMaximum()) && (scrollBar.getValue() + scrollBar.getVisibleAmount() == scrollBar.getMaximum()));
if (preCheck)
textPane.setCaretPosition(doc.getLength());
那部分这就是一直给我找麻烦。首先检查栏是否可见但不可用(没有足够的文本,使栏全长),然后如果栏的底部等于最大值。理论上,这应该起作用。然而没有任何东西,包括移动支票,得到了我想要的结果。
有什么建议吗?
不是重复的this或this,因为他们希望它总是滚动,而不仅仅是有时。
你解决了吗?我有完全相同的任务,实际上,仍然找不到解决方案。 – 2012-11-22 09:54:09