Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在扩展类中使用MouseListener_Java_Swing - Fatal编程技术网

Java 在扩展类中使用MouseListener

Java 在扩展类中使用MouseListener,java,swing,Java,Swing,我有一个扩展了JPanel的类,它包含一个JLabel和一个MouseListener。我有一个子类扩展了它,我希望它具有相同的JLabel,但我希望MouseListener执行不同的操作。代码如下所示: public class FirstClass extends JPanel{ JLabel set1; public FirstClass(){ set1 = new JLabel("Button 1"); set1.addMouseListener(new

我有一个扩展了
JPanel
的类,它包含一个
JLabel
和一个
MouseListener
。我有一个子类扩展了它,我希望它具有相同的
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);
   }
}
然后:


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

addMouseListener
完全按照它的声音做,它添加了另一个
MouseListener
。在执行任何其他代码之前,Java会自动从
SecondClass
调用
FirstClass
的默认构造函数,否则
set1
将为
null

在基类中,创建类似于
mouseWasClicked(MouseEvent evt)
的方法,并使用
MouseListener\mouseClocked
调用它


在扩展类中,重写
mouseSclicked
方法以执行任何其他操作对于
第一类
,有两个构造函数,其中一个接受
mouseStener
参数。使用
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");
    }
}

好的,很酷。实际上,我让它使用一个字符串工作,我在每个构造函数中将该字符串设置为当前类的名称,然后在父类中放入一个IF语句,只是没有更改子类中的侦听器。但这似乎是一种糟糕的方法。我会根据你的建议来做。谢谢
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");
    }
}