Как вызвать внешний метод из обработчика - PullRequest
2 голосов
/ 18 августа 2011

Итак, у меня есть класс MouseListener внутри публичного класса с несколькими методами.Я прикрепил mouseListener к компоненту в публичном классе.

Проблема в том, что я не могу найти простой способ вызова методов в открытом классе, когда я говорю, например, this.showRemove();, область видимости находится внутри класса обработчика, а не из открытого класса.Вот пример кода

public class Game {

 public Game() {

  JPanel pnl = new JPanel();
  pnl.addMouseListener(new GameMouseListener());

 }

 public void showRemove(){

  //Code Here

 }


 class GameMouseListener implements MouseListener {

  public void mouseClicked(MouseEvent e) {
     this.showRemove(); //Can't Find Symbol Here     

  }

 }  

}

Ответы [ 3 ]

4 голосов
/ 18 августа 2011

Когда вы используете this во внутреннем классе, вы ссылаетесь на экземпляр внутреннего класса, а не на хост-класс.

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

HostClass {
    doSomething() {}

    class Inner {
        void blah() {
            HostClass.this.doSomething();
        }
    }
}

Если во внутреннем классе вы вызываете метод также , вы можете избежать явного присвоения имени иможно просто использовать имя метода:

void blah() {
    doSomething();
}
1 голос
/ 18 августа 2011

Поскольку showRemove является нестатическим методом Game, вам необходим экземпляр этого класса, для которого вызывается метод.

Вместо этого вы можете создать анонимный внутренний класс, подобный этому:

pnl.addMouseListener(new MouseAdapter() {
  public void MouseClicked (MouseEvent e) {
    showRemove();
  }
});

Этот слушатель будет связан с работающим экземпляром Game и, следовательно, будет иметь доступ к его нестатическим методам.

0 голосов
/ 18 августа 2011

Вам нужна ссылка на объект Game, чтобы иметь возможность вызывать метод.Когда вы говорите this.showRemoved () «this» ссылается на объект MouseListener вместо объекта Game.

Одна из возможностей состоит в том, чтобы класс Game расширял MouseListener и помещал метод mouseClicked () внутри класса Game.

...