Al llamar a este desde el interior de un anidado de Java ActionListener
-
06-09-2019 - |
Pregunta
Supongamos que tengo esto:
class external {
JFrame myFrame;
...
class internal implements ActionListener {
public void actionPerformed(ActionEvent e) {
...
myFrame.setContentPane(this.createContentPane());
}
}
...
}
createContentPane
devuelve un contenedor. Ahora, si yo estaba haciendo este código fuera del ActionListener
que iba a funcionar, porque tendría acceso a este. Pero, dentro de él, no lo hago. Tengo acceso a myFrame
, que es lo que va a ser actualizado con el contenido del método, pero eso no es suficiente para hacer lo que quiera, a menos que pueda conseguir un presente fuera de él.
También necesito información de otras variables de instancia de usar createContentPane()
, así que no estoy seguro de que puedo hacerlo static
.
Solución
Puede:
myFrame.setContentPane(createContentPane());
o
myFrame.setContentPane(external.this.createContentPane());
Por cierto, en Java clases primera letra suele ser mayúsculas. Su código seguirá compilar y ejecutar si no lo nombra así, pero siguiendo las convenciones de codificación que va a ser capaz de leer el código de otros, y mucho más importante que otro será capaz de leer el código.
Así que esto sería un mejor estilo:
class External {
JFrame myFrame;
...
class Internal implements ActionListener {
public void actionPerformed(ActionEvent e) {
...
myFrame.setContentPane(createContentPane());
//Or myFrame.setContentPane(External.this.createContentPane());
}
}
...
}
Otros consejos
external.this
le dará acceso a la instancia de la clase envolvente, si eso es lo que quiere ...
No estoy seguro exactamente lo que quieres decir, pero una clase interna tiene acceso a todos los miembros de su clase envolvente. Para acceder al puntero "this" de la clase envolvente (por ejemplo, para pasar a otros métodos) usar:
someMethod(External.this);
En su ejemplo, en realidad estás complicando mediante el uso de "este". Aquí hay dos opciones que funcionarán:
myFrame.setContentPane(createContentPane());
o
myFrame.setContentPane(External.this.createContentPane());
Tenga en cuenta que ya se está accediendo a MyFrame de la misma manera.
En primer lugar hay que extender JFrame en su clase externa como esto
class External extends JFrame {
.....
.....
}