Я использую JScrollPane
, а внутри viewportView.doLayout
я звоню viewportView.setPreferredSize
. Это кажется неправильным, потому что полоса прокрутки JScrollPane
всегда обновляется в соответствии с последним setPreferredSize
перед doLayout
. Таким образом, кажется, что в случае повторной проверки JScrollPane
сначала обновляет полосу прокрутки в соответствии с предпочтительным размером, а затем вызывает doLayout
.
Могу ли я изменить это поведение? Или куда мне звонить setPreferredSize
? Или где я должен поместить код, который размещает дочерние компоненты?
Я выяснил один способ, который работает:
Вызов this.setPreferredSize
и this.setSize
внутри viewportView.doLayout
.
Я оставляю этот вопрос открытым, потому что я действительно не понимаю, почему это работает (и не будет, если я удалю один из них) и хотел бы знать.
Хорошо, это сработало, потому что он генерировал бесконечный цикл, то есть он всегда помещал какой-то запрос на повторную проверку в цикл обработки событий и, конечно, это решает проблему. Однако это не совсем решение.
Теперь у меня есть это:
// In viewportView of the JScrollPane:
@Override public void doLayout() {
// ... layout childs ...
// size.x/size.y being the size I want to have for the viewportView
if(size.x != getPreferredSize().width || size.y != getPreferredSize().height) {
setPreferredSize(new Dimension(size.x, size.y));
if(getParent() != null) getParent().validate();
}
}
Кажется, теперь это работает нормально.
Все еще задаюсь вопросом, может ли кто-нибудь уточнить, является ли это верным путем или нет, каким он будет.