пользовательские компоненты Swing, которые изменяют размер динамически, но взаимодействуют с LayoutManagers

#java #swing #layout-manager

#java #swing #layout-manager

Вопрос:

У меня есть подкласс JPanel , который действует как представление для некоторой информации.

При изменении информации также может измениться минимальный / максимальный / предпочтительный размер JPanel .

Как мне правильно обработать это событие, чтобы оно хорошо воспроизводилось с LayoutManager ?

Я попытался переопределить getPreferredSize() , но, похоже, это вызывается только один раз.

Ответ №1:

Попробуйте выполнить повторную проверку вашего компонента после изменения минимального / максимального / предпочтительного размера. Должно сработать.

Комментарии:

1. круто, спасибо! просто чтобы уточнить, вы имеете в виду Component.revalidate() ? download.oracle.com/javase/6/docs/api/javax/swing /…

2. Нет, это должно быть просто revalidate() . Ваш подкласс должен иметь методы, которые изменяют свойства вашего класса. Всякий раз, когда одно из этих свойств изменяется, что потенциально влияет на размер компонента, вы вызываете revalidate() и repaint(). Посмотрите на исходный код для других компонентов Swing. Произнесите JLabel и посмотрите на методы setText() или setIcon(), чтобы увидеть, как это делается.

3. @camickr: Я не понял вашего комментария. Мой ответ неверен?

4. Вам не следует использовать такой код, как component.setPreferredSize(…), component.revalidate(). Вместо этого вам следует переопределить класс и реализовать метод getPreferredSize(). В приведенном выше примере, если вы используете label.setText(«abc»), метод setText() отвечает за вызов метода revalidate(). Вы не выполняете label.setText(…), label.revalidate().

5. @camickr: ну ладно. теперь все ясно. Спасибо вам за объяснение.