Tela só aparece depois que clicar duas vezes

Olá pessoa,
Estou com um probleminha,
Eu tenho duas telas, GUICliente e GUICompra, que são abertas através de um JMenu.

Vamos supor que eu abra primeiro a GUICLiente, e de repente abro GUICompra. As duas ficam abertas na tela, porém, a que está na frente é a GUICompra.
Se eu quiser abrir GUICliente de novo, ele só abre depois que eu clicar duas vezes no menu.
Alguém pode me ajudar?

if(guiCompra == null){
          guiCompra = new GUICompra();
        }
        desktopPane.add(guiCompra);
        desktopPane.moveToFront(guiCompra);
        guiCompra.setPosicao();
        guiCompra.setVisible(true);
 if (guiCliente == null) {
            guiCliente = new GUICliente();

        }
        desktopPane.add(guiCliente);
        desktopPane.moveToFront(guiCliente);
        guiCliente.setVisible(true);
        guiCliente.setPosicao();

Boa noite Cotonety.

Que tal mudar o seu código assim:


   if (guiCompra == null){  
        guiCompra = new GUICompra();   
        desktopPane.add(guiCompra);      
        guiCompra.setVisible(true);
   } else {
        desktopPane.moveToFront(guiCompra);
   }

O que estava acontecendo é que voce estava tentando adicionar ao DesktoPane o Form guiCompra toda vez que voce clicava no menu, sendo somente necessário acrescentá-lo uma única vez, mesmo que ele fique oculto, voce só aciona o comando moveToFront(…) pra ele ficar visível novamente.

Já o método setPosicao(), voce o coloca para ser acionado dentro do construtor de cada Form.

Faço o mesmo com o Form guiCliente.

Não deu certo
Coloqueri o setPosicao() no construtor e esse código, só que as telas não aparecem

Boa tarde Cotonety.

Todo JInternalFrame tem atributos que são “resizable”, “closable”, “maximizable”,“iconifiable”, e todos eles são do tipo booleano, e voce os configura invocando o construtor da super classe deste modo:


  super("Compras", true, true, true, true);
  .....
  .....
  pack();

Onde o primeiro parâmetro é o título, o segundo faz o JInternalFrame ser redimensionável, o terceiro abilita o seu fechamento, e o quarto diz que ele pode ser iconizado ou não, dependendo de como voce invoca o comando acima no construtor.

Outra coisa, eu prefiro utilizar o método pack() do que o setVisible(true), isto porque o pack() força a execução do método paint e todo o desenho do JInternalFrame. Assim sendo coloca os comandos acima em cada construtor de cada JInternalFrame, e nos Menus do Frame Principal, coloque o código abaixo:


if (guiCompra == null || guiCompra.isClosed()){    
     guiCompra = new GUICompra();     
     desktopPane.add(guiCompra);         
} else {  
     guiCompra.toFront(); 
}