Изменение размера JFrame при изменении размера ребенка: как правильно следить? - PullRequest
2 голосов
/ 19 мая 2011

Я пытаюсь работать с JFrame (на самом деле, Frame в оболочке Scala Swing, хотя я не понимаю, почему это должно иметь значение), которое содержит BoxLayout, в котором есть несколько элементов, один из которых изменяет размер в ответ на нажатие кнопки (еще один элемент в BoxLayout).

При изменении размера обработчик события кнопки выполняет следующие действия:

  1. Вызвать метод для элемента (JPanel), который меняет размер; это вызывает setPreferredSize для этого компонента.
  2. Звоните pack на JFrame
  3. Звоните repaint на JFrame

Это работает с одним очень странным предупреждением: JFrame всегда на один шаг позади. Поэтому, если я установлю свои предпочтительные размеры x на 100, 200, 300, 200, 100, JFrame будет иметь ширину 100, 100, 200, 300, 200.

Что может пойти не так, и как мне заставить изменения размера распространяться до размера окна JFrame, когда они должны?

(Более вероятно, но, надеюсь, не относящиеся к делу детали: Ubuntu 10.10 с Sun Java 1.6.0_24.)

Ответы [ 2 ]

4 голосов
/ 19 мая 2011

Когда вы изменяете размер компонента, я бы попытался повторно проверить () родительский контейнер, чтобы снова можно было запустить диспетчер компоновки, который правильно пересчитает все размеры.

Если вам нужна дополнительная помощь, опубликуйте SSCCE , который демонстрирует проблему. И сначала попробуйте сделать это с JFrame, чтобы, если проблема не исчезла, вы знали, что причиной являются стандартные классы JDK или Scala.

1 голос
/ 19 мая 2011

Я согласен с camickr, что вместо pack() необходимо использовать revalidate(). Чтобы исправить «на шаг позади», попробуйте позвонить revalidate() и repaint() в SwingUtilities.invokeLater().

...