我有一个扩展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);
}
}
然后:
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的内容都是有效的,等等只是给我一个问题的听众。如果我错过了任何信息,请告诉我。感谢。
答案 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");
}
}