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());
それが私を悩ませている部分です。最初に、バーが表示されているが使用できないかどうか (テキストが不十分で、バーが完全な長さになっている) かどうかがチェックされ、次にバーの下部が最大値に等しいかどうかがチェックされます。理論的には、それはうまくいくはずです。しかし、小切手を動かしても、私が望む結果は得られませんでした。
助言がありますか?