Вызов этого из вложенного Java ActionListener
-
06-09-2019 - |
Вопрос
Предположим, у меня есть это:
class external {
JFrame myFrame;
...
class internal implements ActionListener {
public void actionPerformed(ActionEvent e) {
...
myFrame.setContentPane(this.createContentPane());
}
}
...
}
createContentPane
возвращает Контейнер.Теперь, если бы я делал этот код вне ActionListener
это сработает, потому что у меня будет к этому доступ.Но внутри этого я этого не делаю.у меня есть доступ к myFrame
, который будет обновлен вместе с содержимым метода, но этого недостаточно, чтобы сделать то, что я хочу, если только я не смогу получить из этого this.
Мне также нужна информация из других переменных экземпляра, чтобы использовать createContentPane()
, поэтому я не уверен, что смогу это сделать static
.
Решение
Вы также можете :
myFrame.setContentPane(createContentPane());
или
myFrame.setContentPane(external.this.createContentPane());
Кстати, в Java-классах первая буква обычно заглавная.Ваш код все равно будет компилироваться и выполняться, если вы не назовете его так, но, следуя соглашениям о кодировании, вы сможете читать чужой код, и, что гораздо важнее, другие смогут читать ваш код.
Так что это будет лучший стиль:
class External {
JFrame myFrame;
...
class Internal implements ActionListener {
public void actionPerformed(ActionEvent e) {
...
myFrame.setContentPane(createContentPane());
//Or myFrame.setContentPane(External.this.createContentPane());
}
}
...
}
Другие советы
external.this
предоставит вам доступ к экземпляру включающего класса, если вы этого хотите...
Не совсем понимаю, о чем вы говорите, но внутренний класс имеет доступ ко всем членам включающего его класса.Чтобы получить доступ к указателю this включающего класса (например, для перехода к другим методам), используйте:
someMethod(External.this);
В вашем примере вы на самом деле усложняете его, используя «это».Вот два варианта, которые подойдут:
myFrame.setContentPane(createContentPane());
или:
myFrame.setContentPane(External.this.createContentPane());
Обратите внимание, что вы уже получаете доступ к myFrame таким же образом.
Сначала вам нужно расширить JFrame во внешнем классе следующим образом:
class External extends JFrame {
.....
.....
}