Вы пробовали использовать 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 () вместо простой печати трассировки стека.
Ваше приложение случайно не однопоточное? Если это так, вы можете запросить список запущенных потоков и получить уведомление, когда они закончатся, а затем установить значение полосы прокрутки. Это вариант?
Или вы можете предоставить ImageObserver для каждого загруженного изображения и установить положение полосы прокрутки, когда все изображения загружены?