Chamar esse de dentro de um aninhado Java ActionListener
-
06-09-2019 - |
Pergunta
Suponha que eu tenho o seguinte:
class external {
JFrame myFrame;
...
class internal implements ActionListener {
public void actionPerformed(ActionEvent e) {
...
myFrame.setContentPane(this.createContentPane());
}
}
...
}
createContentPane
retorna um Container. Agora, se eu estava fazendo isso fora do código do ActionListener
ele iria trabalhar, porque eu teria acesso a isso. Mas, dentro dele, eu não sei. Eu tenho acesso a myFrame
, que é o que vai ser atualizado com o conteúdo do método, mas isso não é o suficiente para fazer o que quiser, a menos que eu possa obter um presente fora dele.
Eu também preciso de informações de outras variáveis ??de instância para uso createContentPane()
, então eu não tenho certeza se posso torná-lo static
.
Solução
Você pode:
myFrame.setContentPane(createContentPane());
ou
myFrame.setContentPane(external.this.createContentPane());
A propósito, em Java aulas primeira letra é geralmente maiúsculas. Seu código ainda irá compilar e executar, se você não nomeá-lo assim, mas, seguindo as convenções de codificação que você vai ser capaz de ler o código outros, e muito mais importante do outro será capaz de ler o seu código.
Portanto, este seria um melhor estilo:
class External {
JFrame myFrame;
...
class Internal implements ActionListener {
public void actionPerformed(ActionEvent e) {
...
myFrame.setContentPane(createContentPane());
//Or myFrame.setContentPane(External.this.createContentPane());
}
}
...
}
Outras dicas
external.this
lhe dará acesso para a instância da classe juntando, se é isso que você quer ...
Não tenho certeza exatamente o que você está querendo chegar, mas uma classe interna tem acesso a todos os membros de sua classe delimitador. Para aceder ao "este" ponteiro da classe envolvente (por exemplo, para passar para outros métodos) a utilização:
someMethod(External.this);
No seu exemplo, você está, na verdade, complicando-lo usando "isto". Aqui estão duas opções que irá trabalhar:
myFrame.setContentPane(createContentPane());
ou
myFrame.setContentPane(External.this.createContentPane());
Note que você já está acessando MyFrame da mesma maneira.
Primeiro você tem que se estendem JFrame em sua classe externa como esta ??p>
class External extends JFrame {
.....
.....
}