2009-02-24 2 views
5

Supponiamo che io sono questo:La chiamata a questo dall'interno di un nidificato Java ActionListener

class external { 
    JFrame myFrame; 
    ... 

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

createContentPane restituisce un contenitore. Ora, se stavo facendo questo codice al di fuori del ActionListener, avrebbe funzionato, perché avrei avuto accesso a questo. Ma al suo interno, io no. Ho accesso a myFrame, che è ciò che verrà aggiornato con il contenuto del metodo, ma ciò non è sufficiente per fare ciò che voglio, a meno che non riesca a ottenerne uno.

Ho anche bisogno di informazioni da altre variabili di istanza per utilizzare createContentPane(), quindi non sono sicuro di poterlo fare static.

risposta

9

È possibile:

myFrame.setContentPane(createContentPane()); 

o

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

A modo, in prima classe le classi Java sono in genere maiuscole. Il tuo codice verrà comunque compilato ed eseguito se non lo chiami così, ma seguendo le convenzioni di codifica sarai in grado di leggere il codice degli altri, e molto più importante sarà la possibilità di leggere il tuo codice.

Quindi questo sarebbe un migliore stile:

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

Contento di aver trovato questo, proprio quello di cui avevo bisogno (per la 400a volta). Sono piuttosto tentato di aggiustare la domanda e questa risposta per non menzionare la lettera maiuscola, in quanto è solo confusa e irrilevante ... ma non lo farò. Grazie +1 –

1

Non sai esattamente cosa stai ricevendo, ma una classe interna ha accesso a tutti i membri della sua classe che li contiene. Per accedere al puntatore "this" della classe contenitrice (ad esempio, per passare ad altri metodi) utilizzare:

someMethod(External.this); 

Nel tuo esempio, si sta effettivamente complicando esso utilizzando "questo". Qui ci sono due opzioni che funzionano:

myFrame.setContentPane(createContentPane()); 

o:

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

nota che si sta già accedendo MyFrame nello stesso modo.

+0

argh, battermi per 8 secondi; -) +1 –

+0

loro sono le pause :) grazie. –

2

external.this vi darà accesso all'istanza della classe contenitrice, se è questo che vuoi ...

0

Prima di tutto bisogna estendere la JFrame nella classe esterna come questo

class External extends JFrame { 
..... 
..... 
}