Можете ли вы использовать адаптер внутри класса Listener?

Мне было интересно, можете ли вы использовать адаптер, скажем, MouseAdapter внутри класса, реализующего MouseListener.

Я знаю, что могу использовать адаптер в качестве анонимного слушателя

    addMouseListener(new MouseAdapter() {
        @Override
        public void mousePressed(MouseEvent e) {
            panel.setBackground(Color.BLACK);
            repaint();
        }

        @Override
        public void mouseReleased(MouseEvent e) {
            panel.setBackground(Color.WHITE);
            repaint();
        }
    });

Но мне было интересно, могу ли я определить отдельный класс Listener без переопределения всех других абстрактных методов, таких как Below

    private class myListener implements MouseListener {
        @Override
        public void mousePressed(MouseEvent e) {
            panel.setBackground(Color.BLACK);
            repaint();
        }

        @Override
        public void mouseReleased(MouseEvent e) {
            panel.setBackground(Color.WHITE);
            repaint();
        }

        @Override
        public void mouseClicked(MouseEvent e) {
        }

        @Override
        public void mouseEntered(MouseEvent e) {
        }

        @Override
        public void mouseExited(MouseEvent e) {
        }
}

person Paul Samsotha    schedule 01.09.2013    source источник


Ответы (1)


Конечно можно, потому что:

public abstract class MouseAdapter implements MouseListener, MouseWheelListener, MouseMotionListener

Он реализует MouseListener.

из http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/awt/event/MouseAdapter.java:

Абстрактный класс адаптера для получения событий мыши. Методы в этом классе пусты. Этот класс существует для удобства создания объектов прослушивателя.

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

Расширьте этот класс, чтобы создать MouseEvent (включая события перетаскивания и движения) и/или прослушиватель MouseWheelEvent и переопределить методы для интересующих событий. (Если вы реализуете интерфейс MouseListener, MouseMotionListener, вы должны определить в нем все методы. Этот абстрактный класс определяет нулевые методы для всех них, поэтому вам нужно будет определять методы только для тех событий, которые вас интересуют.)

Создайте объект прослушивателя с помощью расширенного класса, а затем зарегистрируйте его в компоненте с помощью методов компонента addMouseListener addMouseMotionListener, addMouseWheelListener. Соответствующий метод в объекте прослушивателя вызывается, и ему передается событие MouseEvent или MouseWheelEvent в следующих случаях:

  • при нажатии, отпускании или щелчке кнопки мыши (нажатии и отпускании)
  • когда курсор мыши входит или выходит из компонента
  • при вращении колесика мыши, перемещении или перетаскивании мыши

РЕДАКТИРОВАТЬ:

Если вашему приложению нужно только знать, была ли нажата или отпущена мышь над компонентом, остальные три метода будут пустыми и будут игнорироваться. Эти методы являются ненужным кодом. Классы адаптера могут помочь сократить объем кода, который необходимо написать, когда вашему приложению требуется лишь небольшое подмножество всех методов интерфейса. Каждый класс адаптера полностью реализует связанный с ним интерфейс (или интерфейсы). Затем, если вам нужен прослушиватель для подмножества связанных методов, вам просто нужно предоставить это подмножество. Пустые заглушки не требуются. Вот как раз такой переходник для нужного ранее описанного MouseListener.

MouseListener mouseListener = new MouseAdapter() {
  public void mousePressed(MouseEvent mouseEvent) {
      System.out.println("I'm pressed: " + mouseEvent);
  }
  public void mouseReleased(MouseEvent mouseEvent)  {
      System.out.println("I'm released: " + mouseEvent);
  }
};

https://blogs.oracle.com/CoreJavaTechTips/entry/listeners_vs_adapters

person dantuch    schedule 01.09.2013
comment
но если я не переопределю нижние три метода в MyListener, он не скомпилируется. Как бы вы определили класс, не переопределяя ненужные три? - person Paul Samsotha; 01.09.2013
comment
Все будет хорошо, там есть методы-заглушки, которые пусты, смотрите мое редактирование - person dantuch; 01.09.2013