我试图在包含 JTextPane 的 JScrollPane 上实现智能自动滚动。JTextPane 用于以颜色记录我的应用程序。但是,我在尝试进行智能自动滚动时遇到了困难。通过智能自动滚动,我并不是指每次发生变化时都盲目地自动滚动,我的意思是检查您是否一直向下滚动,然后自动滚动。但是,无论我做什么,它要么总是自动滚动,要么根本不
作为测试脚本,这里是设置(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());
那就是给我带来麻烦的部分。首先检查栏是否可见但不可用(文本不足,使栏成为全长),然后检查栏的底部是否等于最大值。从理论上讲,这应该有效。但是,包括移动支票在内的任何事情都没有得到我想要的结果。
有什么建议么?