无法从内部行动到达现场

时间:2014-12-03 13:00:19

标签: java swing field action jbutton

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

4 个答案:

答案 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.
    }
};