#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: ну ладно. теперь все ясно. Спасибо вам за объяснение.