La chiamata a questo dall'interno di un nidificato Java ActionListener
-
06-09-2019 - |
Domanda
Supponiamo che io sono questo:
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 della ActionListener
che avrebbe funzionato, perché dovrei accesso a questo. Ma, al suo interno, non lo faccio. Ho accesso a myFrame
, che è ciò che sta per essere aggiornata con il contenuto del metodo, ma che non è sufficiente per fare quello che voglio, a meno che non posso ottenere un questo fuori di esso.
Ho anche bisogno di informazioni provenienti da altre variabili di istanza da utilizzare createContentPane()
, quindi non sono sicuro che posso farlo static
.
Soluzione
È possibile:
myFrame.setContentPane(createContentPane());
o
myFrame.setContentPane(external.this.createContentPane());
Tra l'altro, in Java classi prima lettera è di solito in maiuscolo. Il tuo codice sarà ancora compilare ed eseguire se non il nome del genere, ma seguendo Convenzioni di codifica sarete in grado di leggere il codice altrui, e molto più importante altro sarà in grado di leggere il 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());
}
}
...
}
Altri suggerimenti
external.this
ti darà accesso all'istanza della classe contenitrice, se è questo che volete ...
Non so esattamente quello che stai ricevendo in, ma una classe interna ha accesso a tutti i membri della sua classe racchiude. 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 funzioneranno:
myFrame.setContentPane(createContentPane());
o
myFrame.setContentPane(External.this.createContentPane());
Si noti che si sta già accedendo MyFrame nello stesso modo.
Prima di tutto bisogna estendere la JFrame nella classe esterna come questo
class External extends JFrame {
.....
.....
}