0

我想知道您是否可以使用适配器,例如实现 MouseListener 的类中的 MouseAdapter。

我知道我可以将适配器用作匿名侦听器

    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 类而不必重写所有其他抽象方法,如下面

    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) {
        }
}
4

1 回答 1

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接口,你必须在里面定义所有的方法。这个抽象类为它们都定义了null方法,所以你只需要为你关心的事件定义方法。)

使用扩展类创建侦听器对象,然后使用组件的 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

于 2013-09-01T08:47:21.730 回答