Настройка полосы прокрутки на панели JScrollPane
У меня есть это JTextPane
(завернутый в JScrollPane
) который поддерживается HTMLEditorKit
, Содержание JTextPane
простой HTML с некоторыми изображениями (локальными файлами), встроенными с использованием тегов img. Проблема в том, что при загрузке JTextPane
, загрузка занимает доли секунды, а затем появляется полоса прокрутки внизу страницы. Если я сделаю:
JTextPane text = new JTextPane();
JScrollPane scroll = new JScrollPane(text);
// do some set up...
scroll.getVerticalScrollBar().setValue(0);
он на мгновение устанавливает полосу прокрутки, а затем появляется другая команда (предположительно, отвечающая за загрузку изображений) и сбивает полосу прокрутки вниз. Я попытался добавить:
((AbstractDocument)text.getDocument()).setAsynchronousLoadPriority(-1);
но это не исправило это. Есть ли способ получить событие от text.getDocument()
или же text
что уведомит меня о завершении загрузки панели, чтобы я мог установить полосу прокрутки? Альтернативой является то, что я настроил другой поток, чтобы подождать секунду или около того, а затем установил полосу прокрутки, но это плохой взлом.
Ваши предложения?
3 ответа
Вы пытались использовать invokeLater?
final JScrollPane scroll = new JScrollPane(text);
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
scroll.getVerticalScrollBar().setValue(0);
}
});
Если это не сработает, копаться в видах изображений довольно сложно, поэтому мой следующий шаг - отследить, почему меняется полоса прокрутки:
scroll.setVerticalScrollbar(new JScrollBar() {
public void setValue(int value) {
new Exception().printStackTrace();
super.setValue(value);
}
});
Вы также можете использовать отладчик в методе setValue() вместо простой печати трассировки стека.
Следующее решило проблему для меня после 50 минут отчаяния:
JTextPane.grabFocus();
JTextPane.setCaretPosition(20);
Является ли ваше приложение однопоточным? Если это так, вы можете запросить список запущенных потоков и получить уведомление об их завершении, а затем установить значение полосы прокрутки. Это вариант?
Или вы можете предоставить ImageObserver каждому загруженному изображению и установить положение полосы прокрутки, когда все изображения загружены?