Вызов этого из вложенного Java ActionListener

Предположим, у меня есть это:

class external {
    JFrame myFrame;
    ...

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

createContentPane возвращает Контейнер. Теперь, если бы я делал этот код вне программы, ActionListener он работал бы, потому что у меня был бы к нему доступ. Но внутри я этого не делаю. У меня есть доступ myFrame, который будет обновлен с учетом содержимого метода, но этого недостаточно для того, чтобы делать то, что я хочу, если только я не смогу получить это из этого.

Мне также нужна информация из других переменных экземпляра createContentPane(), поэтому я не уверен, что смогу это сделать static .

Ответов (4)

Решение

Вы также можете :

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-коде

external.this предоставит вам доступ к экземпляру включающего класса, если вы этого хотите ...

Не совсем уверен, к чему вы клоните, но у внутреннего класса есть доступ ко всем членам его включающего класса. Для доступа к указателю «this» включающего класса (например, для перехода к другим методам) используйте:

someMethod(External.this);

В вашем примере вы фактически усложняете его, используя «это». Вот два варианта, которые подойдут:

myFrame.setContentPane(createContentPane());

или:

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

Обратите внимание, что вы уже получаете доступ к myFrame таким же образом.

Сначала вам нужно расширить JFrame во внешнем классе следующим образом

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