Por que não devo chamar setVisible (true) antes de adicionar componentes?

Eu já vi isso escrito neste site um número de vezes (como aqui e aqui ) que você não deve chamar setVisible(true) antes de adicionar componentes a um JComponent , mas eu não vi uma explicação, e informações sobre a internet parece escassa.

Por que esse é o caso e o que acontece se você quebrar a regra?

Você não está quebrando nada se ligar primeiro, mas provavelmente precisará ligar novamente se tiver adicionado algo. Else Swing não renderiza os componentes adicionados. É necessário que a JVM chame o método paint(...) do JFrame para que os componentes do JFrame sejam renderizados e setVisible(true) solicitará que a JVM faça exatamente isso. Se você adicionar componentes depois de chamar setVisible (true) e não vir os componentes, verá que eles se “materializarão” se você resize o JFrame. Isso ocorre porque redimensioná-lo faz com que o sistema operacional peça ao Swing para repintar a GUI, e isso resultará em uma paint(...) sendo chamada.

Observe que, se você adicionar um componente depois de criar sua GUI, poderá chamar revalidate() e geralmente repaint() em seu contêiner para obter o novo componente corretamente e renderizado. A repaint() definitivamente será necessária se a alteração nos componentes envolver uma exclusão ou um componente sendo desenhado onde outro componente foi visualizado anteriormente.

Uma sugestão de livro que eu recomendo: Filthy Rich Clients compre Guy e Haase. Apenas compre! Você não vai se arrepender da compra.

Ampliando a análise útil do @ Hovercraft, você também pode ter que reembalar pack() o contêiner de nível superior que o encerra. Este exemplo , que adiciona elementos a um JList após setVisible() , pode ilustrar os trade-offs.