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

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

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

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

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

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

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

  • разрешение отклонено при чтении / записи файла с помощью приложения (.jar) в mac
  • Перемещение JLabel в другой JLabels - GUI
  • как перетаскивать файлы из каталога в java
  • Изменить шрифт во время выполнения
  • Отображение гистограммы данных изображения
  • paintComponent не работает, если его вызывается рекурсивной функцией?
  • Как KeyListener обнаруживает комбинации клавиш (например, ALT + 1 + 1)
  • JOptionPane Передача пользовательских кнопок
  • Рисование простого линейного графика в Java
  • Масштабируйте ImageIcon автоматически до размера метки
  • Простая всплывающая форма java с по меньшей мере двумя полями
  • Давайте будем гением компьютера.