繁体   English   中英

无法从内部行动到达现场

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM