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

时间:2014-07-14 16:44:09

标签: java swing mouseevent event-listener jcomponent

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

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

但是,您无法将MouseAdapter添加到JComponent:必须将其转换为MouseListenerMouseMotionListener等,然后添加相应的MouseAdapter方法。有没有办法可以做到这一点,除了确定MouseListenerMouseMotionListenerfor ( 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

是否有更简单的方法,可能涉及{{1}}的类型签名?

1 个答案:

答案 0 :(得分:1)

MouseAdapter实现所有三个接口。如果方法没有被覆盖,它们将什么也不做。简而言之,您可以跳过这些检查,因为所有这些检查都会因为声明

而返回true
public abstract class MouseAdapter implements MouseListener, MouseMotionListener, MouseWheelListener

简化循环

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