不能访问类型为mainframeclass的封闭实例

时间:2013-03-02 15:02:11

标签: java class tags actionlistener jmenuitem

当我尝试在Eclipse中编译/启动程序时,我收到错误No enclosing instance of type mainframeclass is accessible。这是代码:

public class mainframeclass {

    public static Object mainframemenuitem1;

    public static void main(String[] args) {
        JFrame mainframe = new JFrame(variables.mainframename);

        mainframe.setLayout(new GridLayout());

        mainframe.setSize(variables.mainframewith, variables.mainframeheight);
        mainframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        mainframe.setVisible(variables.mainframevisible);
        mainframe.setResizable(variables.mainframeresizable);

        JMenuBar mainframemenubar = new JMenuBar();
        JMenu mainframemenu = new JMenu("File");
        JMenuItem mainframemenuitem1 = new JMenuItem("Exit");
        mainframe.setJMenuBar(mainframemenubar);

        mainframemenubar.add(mainframemenu);
        mainframemenu.add(mainframemenuitem1);

        actionlistener listen = new actionlistener();
        mainframemenuitem1.addActionListener(listen);

        runningclass.running();
    }

    public class actionlistener implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            if (e.getSource() == mainframemenuitem1)
                System.out.println("Test");
        }
    }
}

我似乎做错了:

actionlistener listen = new actionlistener();

但我不知道是什么。我是Java新手,非常感谢对此问题的任何见解。感谢。

1 个答案:

答案 0 :(得分:4)

您的actionlistener类(应该重命名为遵循Java命名约定并且名称更有意义)是内部类(而不是静态嵌套类),这意味着它仅对mainframeclass的封闭实例有效才能引用......它实际上并不需要 ,因为它引用了mainframemenuitem1无论如何都是静态的。 / p>

所以可以将其更改为:

public static class actionlistener implements ActionListener

它应该有效。好吧,无论如何它会编译。实际上它实际上并不是你想要的,因为你的mainframemenuitem1方法中有两个main变量 - 静态变量,然后是本地变量,所以静态一个永远不会被赋予非空值。

我会将mainframemenuitem1传递给actionlistener的构造函数,并仍然使其成为静态嵌套类,或者只是在mainframemenuitem1方法中使main成为最终版本并创建一个动作监听器的匿名内部类。

说完了:

  

我是java的新手

在这种情况下,我实际上暂时停止使用GUI。在没有GUI引入的复杂性的情况下学习新语言要简单得多。编写控制台应用程序使您可以专注于一次只学习一个事物。