[RESOLVIDO]Melhor modo de se travar múltiplas instancias de um form

2 respostas
R

Boa tarde…

Estou com um problema já conhecido mas gostaria de saber de vocês qual a melhor forma de corrigir ele.

Seguinte atualmente meu programa esta assim:

ação do botão

private void jmiCadPaisesActionPerformed(java.awt.event.ActionEvent evt) { ifrmCadPais CadPais = new ifrmCadPais(); //instancia o internalframe comum.ChamaInternalFrame(CadPais, jdpMain); }
método chamainternalframe, existe para centralizar e permitir que a janela seja “fechavel”

public void ChamaInternalFrame(JInternalFrame ifrm, JDesktopPane jdp){ jdp.add(ifrm); //adiciona o painel ao desktop int lDesk = jdp.getWidth(); //pega a largura do desktop int aDesk = jdp.getHeight(); //pega a altura do desktop int lIFrame = ifrm.getWidth(); //pega a largura do iternalframe int aIFrame = ifrm.getHeight(); //pega a altura do internalframe ifrm.setLocation(lDesk / 2 - lIFrame / 2, aDesk / 2 - aIFrame / 2); //seta a localização do internalframe ifrm.setClosable(true); //seta o internal frame como possível de ser fechado ifrm.setVisible(true); //coloca o internalframe visível }
O Problema é que toda vez que aciono o botão ele instancia um novo frame, beleza, isto é obvio pois estou instanciando ele duas vezes.

Agora a solução que pensei mas nao consegui implementar seria testar se já esta instanciado. Mas como eu faria isto?

2 Respostas

Demys_Cota

Só uma idéia

Crie um método estático

private static IfrmCadPais instacia;
          public static IfrmCadPais getIfrmCadPais(){
                 if(instancia == null){
                        instancia = new IfrmCadPais();
                 }
                 return instancia
          }
ai é  chamar getIfrmCadPais() ao inves de criar um nova instancia.
R
Demys Cota:
Só uma idéia

Crie um método estático

private static IfrmCadPais instacia;
          public static IfrmCadPais getIfrmCadPais(){
                 if(instancia == null){
                        instancia = new IfrmCadPais();
                 }
                 return instancia
          }

ai é só chamar getIfrmCadPais() ao inves de criar um nova instancia.

Implementei sua ideia... fiz uma MicroClasse para setar algumas coisas e coloquei o método que chama a classe em cada form.

Ficou assim:

Método no form
private static ifrmCadCidade instancia;
    public static ifrmCadCidade getIfrmCadCidade(JDesktopPane jdp){
        OperacoesComuns comum = new OperacoesComuns();  //instancia a classe de operações comuns
        if(instancia == null){  //verifica se ja foi instanciada se nao entra
                instancia = new ifrmCadCidade();  //instancia formulario
                comum.ChamaInternalFrame(instancia, jdp); //chama o formulario
        } else {
           comum.CentralizaInternalFrame(instancia, jdp); //se ja tiver sido isntanciado centraliza e tras para frente
        }  
       return instancia;
    }
E parte da classe operações comuns
public class OperacoesComuns {
    
    public OperacoesComuns(){
    } 
       
    public void ChamaInternalFrame(JInternalFrame ifrm, JDesktopPane jdp){
        jdp.add(ifrm); //adiciona o painel ao desktop
        CentralizaInternalFrame(ifrm, jdp);
        ifrm.setVisible(true);    //coloca o internalframe visível
    }
    
    public void CentralizaInternalFrame(JInternalFrame ifrm, JDesktopPane jdp){
        int lDesk = jdp.getWidth();     //pega a largura do desktop
        int aDesk = jdp.getHeight();    //pega a altura do desktop
        int lIFrame = ifrm.getWidth();    //pega a largura do iternalframe
        int aIFrame = ifrm.getHeight();   //pega a altura do internalframe
        ifrm.setLocation(lDesk / 2 - lIFrame / 2, aDesk / 2 - aIFrame / 2); //seta a localização do internalframe
        ifrm.setClosable(true);   //seta o internal frame como possível de ser fechado
        ifrm.toFront(); //tras para frente
    }
    
}
Criado 28 de abril de 2013
Ultima resposta 7 de mai. de 2013
Respostas 2
Participantes 2