[英]Can't reach field from inside action
public class GameMenu extends JPanel{
private final Core core;
private final JButton loadGame;
private final JButton saveGame;
private final JButton exit;
private final JButton newGame;
public GameMenu(Core core){
setPreferredSize(new Dimension(600, 600));
setBackground(Color.BLACK);
this.core = core;
newGame = new JButton(newGameAction);
loadGame = new JButton(loadGameAction);
saveGame = new JButton(saveGameAction);
exit = new JButton(exitGameAction);
add(newGame);
add(loadGame);
add(saveGame);
add(exit);
}
private Action newGameAction = new AbstractAction("New Game") {
@Override
public void actionPerformed(ActionEvent e) {
this.core.
}
};
嗨,我想调用一个核心的方法,而不是调用这个类的方法,这将调用正确的核心方法问题是,我不知道如何达到核心领域cos它无法找到thx
在这方面:
private Action newGameAction = new AbstractAction("New Game") {
@Override
public void actionPerformed(ActionEvent e) {
this.core. // compiling error here: 'core' is not a member of the anonymous inner class
}
};
关键字this
指的是在创建新的Action
实例( 当前对象 )时生成的匿名内部类。 这里解释了这个事实: 使用这个关键字 :
在实例方法或构造函数中,
this
是对当前对象的引用 - 正在调用其方法或构造函数的对象。 您可以使用this
方法从实例方法或构造函数中引用当前对象的任何成员。
由于匿名内部类没有名为core
成员,因此您会收到编译错误。 为了解决这个问题,请看一下这个主题: 来自匿名内部类的外部类的关键字? 。
出于实用目的,您应该替换上面的行来引用您的GameMenu
类:
private Action newGameAction = new AbstractAction("New Game") {
@Override
public void actionPerformed(ActionEvent e) {
GameMenu.this.core.
}
};
或者您可以删除this
关键字,编译器将为您解决相同的问题:
private Action newGameAction = new AbstractAction("New Game") {
@Override
public void actionPerformed(ActionEvent e) {
core. // should be recognised as outer class member
}
};
鉴于匿名内部类没有core
成员,编译器将查找外部类(或最终查找具有适当可见性的层次结构树)并且如果它具有这样的内容,那就是chek,这确实是这种情况。
你是一个内在阶级。 采用:
GameMenu.this.core...
否则, this
指的是您所在的匿名内部类。
随着声明
private Action newGameAction = new AbstractAction("New Game") { ... }
您创建AbstractAction
的匿名子类的实例。 然后,关键字this
引用此实例,而不引用GameMenu
类型的外部实例。 所以没有可用的core
领域。
访问外部GameMenu
实例的core
字段的语法是:
GameMenu.this.core
但是 - 当你还在GameMenu
课程中时 - 你也可以访问私人成员。 所以你只需写:
private Action newGameAction = new AbstractAction("New Game") {
@Override
public void actionPerformed(ActionEvent e) {
doSomethingWith(core);
}
};
当您定义一个匿名类时,从您的语句中删除它,这将表示您的匿名类本身的实例,而在您的匿名类中,您没有名为core的字段。 所以使用它像:
private Action newGameAction = new AbstractAction("New Game") {
@Override
public void actionPerformed(ActionEvent e) {
//core.
}
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.