java - 将 MouseAdapter 列表的所有元素添加到 JComponent

标签 java swing mouseevent event-listener jcomponent

我有一个 JLabel 数组,还有一个包含 MouseAdapter 的列表列表。这个想法是每个 JLabel 都有一个 MouseAdapter 列表。我想迭代这些列表并将 MouseAdapter 添加到每个 JLabel

JLabel[] labels;
ArrayList<ArrayList<MouseAdapter>> labelBehaviors;

但是,您无法将 MouseAdapter 添加到 JComponent:它们必须转换为 MouseListenerMouseMotionListener等,然后添加相应的方法。除了确定 MouseAdapter 是否是 MouseListenerMouseMotionListener 等的实例,然后进行转换之外,还有什么方法可以做到这一点它并用正确的方法添加它?

我正在尝试这样做:

for ( int i = 0; i < LABEL_COUNT; i++ ) {
  JLabel label = labels[i];
  if ( label != null ) {
    // Add associated behaviors to the label.
    for ( MouseAdapter behavior : labelBehaviors.get( i ) ) {
      // addMouseEventListener() doesn't exist...
      label.addMouseEventListener( behavior );
    }
  }
}

我不想做这样的事情,除非没有更简单的方法:

for (int i = 0; i < LABEL_COUNT; i++ ) {
  JLabel label = labels[i];
  if ( label != null ) {
    // Add associated behaviors to the label.
    for ( MouseAdapter behavior : labelBehaviors.get( i ) ) {
      // Check type of behavior.
      if ( behavior instanceof MouseListener ) {
        label.addMouseListener( (MouseListener) behavior );
      } else if ( behavior instanceof MouseMotionListener ) {
        label.addMouseMotionListener( (MouseMotionListener) behavior );
      } else if ( behavior instanceof MouseWheelListener ) {
        label.addMouseWheelListener( (MouseWheelListener) behavior );
      }
    }
  }
}

有没有更简单的方法,也许涉及labelBehaviors的类型签名?

最佳答案

MouseAdapter 实现所有三个接口(interface)。如果这些方法没有被重写,它们将不会执行任何操作。简而言之,您可以跳过这些检查,因为由于声明,所有这些检查都会返回 true

public abstract class MouseAdapter implements MouseListener, MouseMotionListener, MouseWheelListener

简化的循环是

for ( MouseAdapter behavior : labelBehaviors.get( i ) ) {
    label.addMouseListener( behavior );
    label.addMouseMotionListener( behavior );
    label.addMouseWheelListener( behavior );
}

关于java - 将 MouseAdapter 列表的所有元素添加到 JComponent,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24741554/

相关文章:

java - 将事件监听器添加到组件并将该组件添加到面板或框架的顺序是什么?

java - 如何禁用Jetty11中的jetty图标

java - 如何避免重复的 JUnit 测试

java - boolean 条件总是评估 true

java - 用 Java 编辑单选按钮

java - 当将其调用到 main 中时,Keylistener 和 actionlistener 不起作用。

Java:JTextField不会出现

javascript - 理解 Dart 的元素事件

java - 作为模式属性传递时,正则表达式不起作用

c# - 如何检测鼠标是否直接在 WPF 中的对象类型上