我正在尝试使用内部类设置,但是我遇到了一些问题。这是我正在尝试使用的代码:
public class GUI
{
class ButtonHandler implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
// do something
}
}
private static void someMethod()
{
JButton button = new JButton( "Foo" );
button.addActionListener(new ButtonHandler());
}
}
这是我得到的错误消息(在eclipse中):
No enclosing instance of type GUI is accessible. Must qualify the allocation with an enclosing instance of type GUI (e.g. x.new A() where x is an
instance of GUI).
有人可以帮帮我吗?
答案 0 :(得分:8)
更改声明:
class ButtonHandler implements ActionListener
要:
static class ButtonHandler implements ActionListener
如果没有“static”修饰符,它就是一个实例级内部类,这意味着你需要一个封闭的GUI
类的实例来使它工作。如果你把它作为一个“静态”内部类,它就像一个普通的顶级类(隐式静态)。
(在您的示例中,这是必要的关键原因是someMethod
是静态的,因此您在该上下文中没有封闭类的实例。)
答案 1 :(得分:2)
我相信它会给你这个错误,因为这是在静态方法中完成的。由于ButtonHandler
是非静态嵌套类,因此必须将其绑定到封闭的GUI
实例。很可能你只想要一个静态嵌套类:
static class ButtonHandler implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
// do something
}
}
答案 2 :(得分:1)
让你的内部类静态。 :)
答案 3 :(得分:1)
要创建非静态内部类的实例,您需要拥有周围外部类的实例(并且没有,因为someMethod
是静态的):
JButton button = new JButton( "Foo" );
button.addActionListener(new GUI().new ButtonHandler());
如果内部类不需要访问外部类的成员/方法,那么将内部类设为静态,那么就可以像这样创建内部类的实例:
static class ButtonHandler implements ActionListener { ... }
...
JButton button = new JButton( "Foo" );
button.addActionListener(new GUI.ButtonHandler());
(在这种情况下,即使是普通new ButtonHandler()
也可以,因为someMethod()
在外部类GUI
中定义,即在与ButtonHandler
相同的“名称空间”中<) p>
答案 4 :(得分:0)
您正尝试从静态成员中访问非静态成员。当您在静态函数中访问ButtonHandler时,成员类不可见,因为它与GUI类的实例相关联。
答案 5 :(得分:0)
你应该使ButtonHandler
成为静态类。例如:
static class ButtonHandler implements ActionListener
在Java中,static
内部类不需要实例化容器类的实例。你可以简单地new ButtonHandler()
(正如你现在所做的那样)。
仅为了您的信息,您还可以更改行
button.addActionListener(new ButtonHandler());
到
button.addActionListener(this.new ButtonHandler());
但我不推荐它。