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


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

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

2 ответа:

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

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

Книга предположение, что я очень рекомендую: грязные богатые клиенты покупают Гая и Хаасе. Просто купите его! Вы не пожалеете о покупке.

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