Existe o método show(), mas está deprecated. Portanto, o meio oficial é só o serVisible mesmo. Para que você queria outro método?
Não, é a geralmente a melhor opção.
Outras opções são através de métodos setters, ou fazer com que sua janela escute eventos de outras.
E claro, há sempre a opção gambi de variáveis estáticas, mas essa gera tantos problemas que não deveria nem ser considerada (embora seja relativamente popular nos códigos dos iniciantes do GUJ).
Na verdade, você usa uma combinação de gerenciadores de layout para chegar na tela desejada.
Por exemplo, você pode começar com um BorderLayout para dividir a tela nas 5 áreas. Na área sul você coloca um painel com FlowLayout para conter botões (salvar, fechar, etc). Na área CENTER você coloca um GridBagLayout, para conter alguns componentes. E na área EAST você poderia colocar um GridLayout com uma JTree e um JTable de propriedades.
Usar paineis sobre paineis, cada um com seu próprio layout manager é uma maneira bastante efetiva de se conseguir o layout final desejado. Mas não crie layouts que dependam de posições exatas de componentes, pixel-a-pixel. Isso não só não é portável, como será muito difícil de fazer, e dificilmente tornará as janelas redimensionáveis.