Настройка полосы прокрутки на панели 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 каждому загруженному изображению и установить положение полосы прокрутки, когда все изображения загружены?

Другие вопросы по тегам