Возникла проблема с использованием внутреннего класса (Java) - PullRequest
2 голосов
/ 20 октября 2011

Я пытаюсь использовать настройку внутреннего класса, однако у меня возникают некоторые проблемы.Это код, который я пытаюсь использовать:

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());
   }
}

Это сообщение об ошибке, которое я получаю (в затмении):

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).

Пожалуйста, кто-нибудь может мне помочь?

Ответы [ 6 ]

8 голосов
/ 20 октября 2011

Измените объявление с:

class ButtonHandler implements ActionListener

На:

static class ButtonHandler implements ActionListener

Без модификатора static это внутренний класс уровня экземпляра, что означает, что вам нужен экземпляркласс GUI для работы.Если вы сделаете его «статическим» внутренним классом, он будет действовать как обычный класс верхнего уровня (который неявно статичен).

(И ключевая причина, по которой это необходимо в вашем примере, заключается в том, что someMethodявляется статическим, и поэтому у вас нет экземпляра класса включения в этом контексте.)

2 голосов
/ 20 октября 2011

Я считаю, что это дает вам эту ошибку, так как это делается статическим методом. Поскольку ButtonHandler является нестатическим вложенным классом, он должен быть привязан к включающему экземпляру GUI. Скорее всего, вы просто хотите использовать статический вложенный класс:

static class ButtonHandler implements ActionListener
{
    public void actionPerformed(ActionEvent e)
    {
      // do something
    }
}
1 голос
/ 20 октября 2011

Чтобы создать экземпляр нестатического внутреннего класса, вам нужно иметь экземпляр окружающего внешнего класса (а его нет, потому что 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)

1 голос
/ 20 октября 2011

Сделайте ваш внутренний класс статичным.:)

0 голосов
/ 20 октября 2011

Вы должны сделать ButtonHandler статическим классом. Например:

static class ButtonHandler implements ActionListener

В Java внутренним классам static не требуется экземпляр класса контейнера для создания экземпляра. Вы можете просто сделать new ButtonHandler() (как вы делаете в настоящее время).

Только для вашей информации, вы также можете изменить строку

button.addActionListener(new ButtonHandler());

до

button.addActionListener(this.new ButtonHandler());

Но я бы не советовал.

0 голосов
/ 20 октября 2011

вы пытаетесь получить доступ к нестатическому члену из статического члена. Когда вы обращаетесь к ButtonHandler внутри статической функции, класс-член не отображается, так как он связан с экземпляром класса GUI.

...