在扩展类中使用MouseListener

时间:2015-01-09 03:56:54

标签: java swing

我有一个扩展JPanel的类,其中包含JLabelMouseListener。我有一个扩展它的子类,我希望它具有相同的JLabel,但我希望MouseListener执行不同的操作。代码看起来像这样:

public class FirstClass extends JPanel{
   JLabel set1;

   public FirstClass(){
   set1 = new JLabel("Button 1");
      set1.addMouseListener(new MouseAdapter() {
     @Override
     public void mouseClicked(MouseEvent e) {
            System.out.println("MouseEventOne");
     }
      });
   this.add(set1);
   }
}

然后:

public class SecondClass extends FirstClass {

   public SecondClass(){
   set1.setText("Button 2");
      set1.addMouseListener(new MouseAdapter() {
     @Override
     public void mouseClicked(MouseEvent e) {
            System.out.println("Different MouseEvent");
     }
      });
   }
}

因此,当我这样做时,文本会发生变化,一切看起来都很好,但它会执行两个鼠标侦听器。有没有办法这样做它只执行与程序当前显示的面板对应的事件?不应该子类中的addMouseListener()覆盖父类中的{{1}}吗?我只包含了与问题相关的代码,请注意JPanel的内容都是有效的,等等只是给我一个问题的听众。如果我错过了任何信息,请告诉我。感谢。

2 个答案:

答案 0 :(得分:1)

addMouseListener完全听起来像它,它增加了另一个MouseListener。在执行任何其他代码之前,Java会自动从FirstClass调用SecondClass的默认构造函数,否则set1将为null ...

在您的基类中,创建类似mouseWasClicked(MouseEvent evt)的方法,然后使用MouseListener#mouseClcked来调用它。

在扩展类中,覆盖mouseWasClicked方法以执行您想要执行的任何操作

答案 1 :(得分:1)

FirstClass提供两个构造函数,其中一个构造函数采用MouseListener参数。使用SecondClass中的第二个构造函数。

public class FirstClass extends JPanel{
    JLabel set1;

    public FirstClass(){
        this(new MouseAdaptor() {
            @Override
            public void mouseClicked(MouseEvent e) {
                System.out.println("MouseEventOne");
            }
        });
    }

    protected FirstClass(MouseListener listener) {
        set1 = new JLabel("Button 1");
        set1.addMouseListener(listener);
        this.add(set1);
    }
}

然后

public class SecondClass extends FirstClass {
    public SecondClass() {
        super(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                System.out.println("Different MouseEvent");
            }
        });

        set1.setText("Button 2");
    }
}