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.
}
};
HI,我想调用一个核心方法,而不是调用这个类的方法,这个方法可以调用正确的核心方法 问题是我不知道如何到达它无法找到的核心领域 THX
答案 0 :(得分:4)
在此背景下:
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
实例(当前对象)时生成的anonymous内部类。这里解释了这个事实:Using the this Keyword:
在实例方法或构造函数中,
this
是对它的引用 当前对象 - 其方法或构造函数所在的对象 调用。您可以从内部引用当前对象的任何成员 使用this
的实例方法或构造函数。
由于匿名内部类没有名为core
的成员,因此您会收到编译错误。为了解决这个问题,请看一下这个主题:Keyword for the outer class from an anonymous inner class?。
出于实际目的,你应该替换上面这一行来引用你的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,这确实是情况下。
答案 1 :(得分:3)
你在内心阶层。使用:
GameMenu.this.core...
否则,this
指的是您所在的匿名内部类。
答案 2 :(得分:2)
声明
private Action newGameAction = new AbstractAction("New Game") { ... }
您创建AbstractAction
的匿名子类的实例。然后,关键字this
引用此实例,而不引用类型GameMenu
的外部实例。因此,没有core
字段可用。
访问外部core
实例的GameMenu
字段的语法是:
GameMenu.this.core
但是 - 因为你还在GameMenu
课程内 - 你现在也可以访问私人会员。所以你只需写:
private Action newGameAction = new AbstractAction("New Game") {
@Override
public void actionPerformed(ActionEvent e) {
doSomethingWith(core);
}
};
答案 3 :(得分:0)
从您的语句中删除它,因为您正在定义一个匿名类,其中这将表示您的匿名类本身的实例,而在您的匿名类中,您没有名为core的字段。所以使用它:
private Action newGameAction = new AbstractAction("New Game") {
@Override
public void actionPerformed(ActionEvent e) {
//core.
}
};