Почему я не должен называть setVisible (true) перед добавлением компонентов?

Я видел его на этом сайте несколько раз (например, здесь и здесь), что вы не должны называть setVisible(true) перед добавлением компонентов в JComponent, но я не видел объяснений, и информация в Интернете кажется скудной.

Почему это так, и что произойдет, если вы нарушите правило?

Ответ 1

Вы не нарушаете ничего, если вы его сначала назовете, но вам, вероятно, потребуется снова позвонить, если вы что-то добавили. Else Swing не будет добавлять дополнительные компоненты. Вам нужно, чтобы JVM вызывал метод JFrame paint(...) для отображения компонентов JFrame, а setVisible(true) попросил JVM сделать именно это. Если вы когда-либо добавляли компоненты после вызова setVisible (true) и не видите компоненты, вы обнаружите, что они "материализуются", если вы измените размер JFrame. Это связано с тем, что повторная калибровка заставит операционную систему попросить Swing перерисовать GUI, и это приведет к вызову paint(...).

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

Рекомендация книги о том, что я высоко рекомендую: Filthy Rich Клиенты покупают Guy и Haase. Просто купите! Вы не пожалеете о покупке.

Ответ 2

Усиляясь в аналитическом анализе @Hovercraft, вам также может потребоваться вернуть pack() прилагаемый контейнер верхнего уровня. Этот пример, который добавляет элементы в JList после setVisible(), может иллюстрировать компромиссы.