我正在尝试在包含JTextPane的JScrollPane上实现智能自动滚动。 JTextPane用于以彩色记录我的应用程序。然而,我在尝试进行智能自动滚动时遇到了困难。 智能自动滚动不是指每次更改都盲目地自动滚动,而是检查是否已经滚动到底部,然后再执行自动滚动。但无论我做什么,它要么总是自动滚动,要么根本不滚动。
这里是一个测试脚本的设置(省略了JFrame)。
那是一直困扰我的部分。首先要检查该栏是否可见但无法使用(文字不足,使栏变为全长),然后再检查栏底部是否等于最大值。理论上,这应该有效。然而,包括移动检查位置在内,没有得到我想要的结果。
有什么建议吗?
注意:与此处和不同,因为它们希望始终滚动,而不仅仅是有时候。
这里是一个测试脚本的设置(省略了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());
那是一直困扰我的部分。首先要检查该栏是否可见但无法使用(文字不足,使栏变为全长),然后再检查栏底部是否等于最大值。理论上,这应该有效。然而,包括移动检查位置在内,没有得到我想要的结果。
有什么建议吗?
注意:与此处和不同,因为它们希望始终滚动,而不仅仅是有时候。