2009-02-24 19 views
5

Supongamos que tengo esto:desde dentro de un anidado de Java ActionListener

class external { 
    JFrame myFrame; 
    ... 

    class internal implements ActionListener { 
     public void actionPerformed(ActionEvent e) { 
      ... 
      myFrame.setContentPane(this.createContentPane()); 
     } 
    } 
    ... 
} 

createContentPane devuelve un contenedor. Ahora, si estuviera haciendo este código fuera del ActionListener, funcionaría, porque tendría acceso a esto. Pero, dentro de eso, no. Tengo acceso al myFrame, que es lo que se va a actualizar con el contenido del método, pero eso no es suficiente para hacer lo que quiero, a menos que pueda obtener esto.

También necesito información de otras variables de instancia para usar createContentPane(), así que no estoy seguro de poder hacerlo static.

Respuesta

9

Puede:

myFrame.setContentPane(createContentPane()); 

o

myFrame.setContentPane(external.this.createContentPane()); 

Por el manera, en las clases de Java, la primera letra suele ser mayúscula. Su código aún se compilará y ejecutará si no lo nombra así, pero siguiendo las convenciones de codificación podrá leer el código de los demás, y otro mucho más importante podrá leer su 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()); 
      } 
     } 
    ... 
} 

Java Code conventions

+0

Me alegro de haber encontrado esto, justo lo que necesitaba (por 400a vez). Estoy un poco tentado de ajustar la pregunta y esta respuesta para no mencionar la letra mayúscula, ya que es confusa e irrelevante ... pero no lo haré. Gracias +1 –

1

No estoy seguro exactamente de lo que está obteniendo, pero una clase interna tiene acceso a todos los miembros de su clase adjunta. Para acceder al puntero "this" de la clase envolvente (por ejemplo, para pasar a otros métodos) utilizar:

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.

+0

argh, me golpearon por 8 segundos; -) +1 –

+0

ellos son los descansos :) gracias. –

2

external.this le dará acceso a la instancia de la clase envolvente, si eso es lo que quiere ...

0

primer lugar hay que extender JFrame en su clase externa como esto

class External extends JFrame { 
..... 
..... 
} 
Cuestiones relacionadas