Java и JScrollPane: где вызвать setPreferredSize? - PullRequest
1 голос
/ 13 января 2011

Я использую 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();
    }
}

Кажется, теперь это работает нормально.

Все еще задаюсь вопросом, может ли кто-нибудь уточнить, является ли это верным путем или нет, каким он будет.

1 Ответ

0 голосов
/ 13 января 2011

Если вы хотите, чтобы размер содержимого JScrollPane (например, JPanel) был установлен в качестве содержимого. Если вы хотите, чтобы размер JScrollPane был установлен для JScrollPane. Нет необходимости вызывать методы viewPortView.

...