Вложенный экземпляр типа mainframeclass недоступен

Я получаю сообщение об ошибке No enclosing instance of type mainframeclass is accessible, когда пытаюсь скомпилировать/запустить свою программу в Eclipse. Вот код:

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 и буду признателен за любое понимание этой проблемы. Спасибо.


person Stefan Voorderhake    schedule 02.03.2013    source источник


Ответы (1)


Ваш класс actionlistener (который следует переименовать в соответствии с соглашениями об именах Java и с более осмысленным именем) является внутренним классом (в отличие от статического вложенного класса), что означает, что он действителен только с окружающим экземпляром. из mainframeclass для ссылки... что на самом деле ему не нужно, учитывая, что он ссылается на mainframemenuitem1, который в любом случае является статическим.

Поэтому вы можете просто изменить его на:

public static class actionlistener implements ActionListener

и это должно работать. Ну, он все равно скомпилируется. На самом деле он не будет делать то, что вы хотите, потому что у вас есть две переменные mainframemenuitem1 - статическая, а затем локальная в вашем методе main, поэтому статической никогда не присваивается ненулевое значение. ценность.

Я бы либо передал mainframemenuitem1 в конструктор actionlistener и по-прежнему сделал бы его статическим вложенным классом, либо просто сделал бы mainframemenuitem1 final в методе main и создал анонимный внутренний класс для прослушивателя действий.

Было сказано, что:

я новичок в java

В этом случае я бы на данный момент полностью остановился на графическом интерфейсе. Гораздо проще изучить новый язык без сложностей, связанных с графическим интерфейсом. Написание консольных приложений позволяет сосредоточиться на изучении одной вещи за раз.

person Jon Skeet    schedule 02.03.2013