Aufruf dieser aus dem Inneren einer verschachtelten Java Action
-
06-09-2019 - |
Frage
Angenommen, ich habe dies:
class external {
JFrame myFrame;
...
class internal implements ActionListener {
public void actionPerformed(ActionEvent e) {
...
myFrame.setContentPane(this.createContentPane());
}
}
...
}
createContentPane
gibt einen Container. Nun, wenn ich außerhalb des ActionListener
diesen Code tat es funktionieren würde, weil ich den Zugriff auf diese haben würde. Aber im Inneren, das tue ich nicht. Ich habe Zugang zu myFrame
, das ist das, was mit dem Inhalt des Verfahrens aktualisiert werden wird, aber das ist nicht genug, um zu tun, was ich will, es sei denn, ich dies aus ihn heraus bekommen.
Ich brauche auch Informationen von anderen Instanzvariablen createContentPane()
zu verwenden, so dass ich bin mir nicht sicher, ob ich es static
machen.
Lösung
Sie können entweder:
myFrame.setContentPane(createContentPane());
oder
myFrame.setContentPane(external.this.createContentPane());
Durch die Art und Weise, in Java Klassen erste Buchstaben sind in der Regel groß geschrieben. Ihr Code wird noch kompilieren und ausführen, wenn Sie es nicht so nennen, aber durch folgende Codierung Konventionen werden Sie in der Lage sein, anderen Code zu lesen, und viel wichtiger, andere in der Lage, den Code zu lesen.
So würde dies eine bessere Art sein:
class External {
JFrame myFrame;
...
class Internal implements ActionListener {
public void actionPerformed(ActionEvent e) {
...
myFrame.setContentPane(createContentPane());
//Or myFrame.setContentPane(External.this.createContentPane());
}
}
...
}
Andere Tipps
external.this
geben Sie die Instanz der umgebenden Klasse zuzugreifen, wenn das, was Sie wollen ...
nicht genau, was Sie bekommen an, aber eine innere Klasse hat Zugriff auf alle Mitglieder seiner umgebenden Klasse. Für den Zugriff auf den „diesen“ Zeiger der umgebenden Klasse (zum Beispiel passieren zu anderen Methoden) verwenden:
someMethod(External.this);
In Ihrem Beispiel Sie verkompliziert es tatsächlich von „this“ verwendet wird. Hier sind zwei Optionen, die funktioniert:
myFrame.setContentPane(createContentPane());
oder:
myFrame.setContentPane(External.this.createContentPane());
Beachten Sie, dass Sie bereits MyFrame auf die gleiche Weise zugreifen.
Als erstes müssen Sie JFrame in Ihrer äußeren Klasse wie folgt verlängern
class External extends JFrame {
.....
.....
}