Я пытаюсь выполнить автоматическую прокрутку smart на JScrollPane, содержащей JTextPane.JTextPane используется для регистрации моего приложения в цвете.Однако я врезаюсь в стену, пытаясь сделать умную автопрокрутку.Под интеллектуальной автопрокруткой я не подразумеваю слепую автопрокрутку каждый раз, когда что-то меняется, я имею в виду проверку на предмет прокрутки полностью вниз, затем автопрокрутка.Однако, независимо от того, что я делаю, он всегда либо автоматически прокручивается, либо вообще не выполняется
В качестве тестового сценария приведена настройка (JFrame пропущен)уродливое автоматическое добавление тестовой петли
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());
Это та часть, которая доставляла мне неприятности.Сначала нужно проверить, видима ли полоса, но не используется ли она (недостаточно текста, что делает полосу полной длины), а затем, если нижняя часть полосы равна максимальному.Теоретически это должно работать.Однако ничто, включая перемещение чека, не дало желаемых результатов.
Есть предложения?
НЕ ДУБЛИРУЕТ это или это , так как они хотят, чтобы он всегда прокручивал, а не просто иногда.