Вызов этого изнутри вложенного Java ActionListener - PullRequest
5 голосов
/ 24 февраля 2009

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

class external {
    JFrame myFrame;
    ...

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

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

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

Ответы [ 4 ]

10 голосов
/ 24 февраля 2009

Вы можете либо:

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

2 голосов
/ 24 февраля 2009

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

1 голос
/ 24 февраля 2009

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

someMethod(External.this);

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

myFrame.setContentPane(createContentPane());

или

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

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

0 голосов
/ 16 апреля 2009

Сначала вы должны расширить JFrame в вашем внешнем классе, как это

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