从嵌套的Java ActionListener中调用它

时间:2009-02-24 02:28:20

标签: java user-interface swing actionlistener

假设我有这个:

class external {
    JFrame myFrame;
    ...

    class internal implements ActionListener {
        public void actionPerformed(ActionEvent e) {
             ...
             myFrame.setContentPane(this.createContentPane());
        }
    }
    ...
}

createContentPane返回一个Container。现在,如果我在ActionListener之外执行此代码,它将起作用,因为我可以访问它。但是,在里面,我没有。我可以访问myFrame,这将是用方法的内容更新的内容,但这还不足以做我想要的事情,除非我能从中得到它。

我还需要来自其他实例变量的信息才能使用createContentPane(),因此我不确定是否可以使用static

4 个答案:

答案 0 :(得分:9)

你可以:

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());
            }
        }
    ...
 }

Java Code conventions

答案 1 :(得分:2)

external.this将允许您访问封闭类的实例,如果这是您想要的...

答案 2 :(得分:1)

不确定您到底得到了什么,但内部类可以访问其封闭类的所有成员。要访问封闭类的“this”指针(例如,传递给其他方法),请使用:

someMethod(External.this);

在您的示例中,您实际上使用“this”使其复杂化。以下是两个可行的选项:

myFrame.setContentPane(createContentPane());

或:

myFrame.setContentPane(External.this.createContentPane());

请注意,您已经以相同的方式访问myFrame。

答案 3 :(得分:0)

首先,您需要在外部类中扩展JFrame,如此

class External extends JFrame {
.....
.....
}