Variavel perde valor?

Seguinte, eu consegui tratar meus panels como preciso porem criei uma classe chamada ControlaPanels e nela eu tenho a seguinte estrutura.

public class ControlaPanels{
    // classe que controla ações nos panels
    private JPanel panel = null;
    private JLabel status = null;

public void setPainel(JPanel panel){
    this.panel = panel;
    }

public JPanel getPainel(){
    return this.panel;
    }
}


public class Principal {
    // aqui eu crio os panels e uso metodos para definilos
   ControlaPanels controlaPanels = new ControlaPanels();
   private void maybeShowPopup(MouseEvent e) {

               if (e.isPopupTrigger()) {
                    popUpGetPanel.show(e.getComponent(), e.getX(), e.getY());
                    // panels 
                    JPanel painel = (JPanel)e.getComponent();
                    controlaPanels.setPanel(painel);
                    System.out.println(controlaPanels.getPainel().getName()); //ate aqui td bem, tenho o retorno do nome do panel
               }

   }
}

public class MeusPanels {
 //aqui esta o problema
  ControlaPanels controlaPanels = new ControlaPanels();
  public void exibeMeuPanel(){
       controlaPanels.getPainel(); //retorna valor null
  }

}

Quando invoco a classe ControlaPanels por outra classe e uso um metodo para pegar o getPainel() ela retorna “null”. Quero fazer com que depois de definida as variaveis ela mantenha até que sejam trocados os valores.

obrigado.

kkk…Eu msm vou me responder essa, “Fernando é só usar static” …kkk !

abraços.

Estranho, não deveria retornar null. Tem certeza que o ControlPanel que você está pegando é o mesmo que você pensa que é?

Uma dica. Em 99.99% dos casos, static não é uma solução para o problema. Statics tem diversos problemas: São difíceis de sincronizar, tem escopo global e nunca saem de escopo (por isso, são também os principais responsáveis por memory leaks).

[quote=fernandopaiva]Seguinte, eu consegui tratar meus panels como preciso porem criei uma classe chamada ControlaPanels e nela eu tenho a seguinte estrutura.

public class ControlaPanels{
    // classe que controla ações nos panels
    private JPanel panel = null;
    private JLabel status = null;

public void setPainel(JPanel panel){
    this.panel = panel;
    }

public JPanel getPainel(){
    return this.panel;
    }
}


public class Principal {
    // aqui eu crio os panels e uso metodos para definilos
   ControlaPanels controlaPanels = new ControlaPanels();
   private void maybeShowPopup(MouseEvent e) {

               if (e.isPopupTrigger()) {
                    popUpGetPanel.show(e.getComponent(), e.getX(), e.getY());
                    // panels 
                    JPanel painel = (JPanel)e.getComponent();
                    controlaPanels.setPanel(painel);
                    System.out.println(controlaPanels.getPainel().getName()); //ate aqui td bem, tenho o retorno do nome do panel
               }

   }
}

public class MeusPanels {
 //aqui esta o problema
  ControlaPanels controlaPanels = new ControlaPanels();
  public void exibeMeuPanel(){
       controlaPanels.getPainel(); //retorna valor null
  }

}

Quando invoco a classe ControlaPanels por outra classe e uso um metodo para pegar o getPainel() ela retorna “null”. Quero fazer com que depois de definida as variaveis ela mantenha até que sejam trocados os valores.

obrigado.
[/quote]

Fala, Fernando!
Tudo bem?

Bom, aqui…

public class Principal {
   // aqui eu crio os panels e uso metodos para definilos
   ControlaPanels controlaPanels = new ControlaPanels();
   //...
}

você cria uma referência para a sua classe ControlaPanels. Até aí tudo bem, você preenche ela com um JPanel e boa!

Agora, aqui…

public class MeusPanels {
   //aqui esta o problema
   ControlaPanels controlaPanels = new ControlaPanels();
   //...
}

Você cria uma nova referência pra sua classe, alocando ela em um novo bloco de memória. Ou seja, como é um novo local na memória e uma nova instância, ela começa com null mesmo!

Agora, você pode resolver da seguinte maneira:

public class ControlaPanels {
   // classe que controla ações nos panels
   private JPanel panel = null;
   private JLabel status = null;
   
   // Crie uma variável estática para representar a instância da sua classe:
   private static ControlaPanels anInstance = new ControlaPanels();
   // E crie também um método estático para fazer o acesso à classe:
   private static ControlaPanels getInstance()
   {
      return anInstance;
   }

   public void setPainel(JPanel panel) {
      this.panel = panel;
   }

   public JPanel getPainel() {
      return this.panel;
   }
}

O que acontece? Você garante que sua classe tenha somente uma instância na memória, e não vai perder a referência nem os valores que você colocou nela!
Daí você me pergunta: “Mas Nícolas, como faço para usar a minha classe?”. Faça uso através do método getInstance(), que retorna a sua instância da classe e permite acessar os métodos dela!

Como o Vini disse, não use a classe estática, que isso gerará estes problemas citados.

Espero ter ajudado, abraços!