我的问题是当我创建一个继承自JPanel的类时,为什么不使用super.addMouseListener()来添加一个监听器呢?我认为这个方法是在超级类中,即JPanel。 这是代码:
private class DrawPanel extends JPanel
{
private int prefwid, prefht;
// Initialize the DrawPanel by creating a new ArrayList for the images
// and creating a MouseListener to respond to clicks in the panel.
public DrawPanel(int wid, int ht)
{
prefwid = wid;
prefht = ht;
chunks = new ArrayList<Mosaic>();
// Add MouseListener to this JPanel to respond to the user
// pressing the mouse. In your assignment you will also need a
// MouseMotionListener to respond to the user dragging the mouse.
addMouseListener(new MListen());
}
答案 0 :(得分:2)
因为没有必要。
您没有在addMouseListener
类中声明方法DrawPanel
,因此编译器会检查超类以查找此类方法,并在java.awt.Component
中找到它。因为这个方法是由DrawPanel
类继承的,所以可以在这里调用它。
如果您想了解深层原因,则需要阅读JLS Sec 15.12, "Method Invocation Expressions"。然而,这并不是简单的阅读。
我认为关键句是:
<强> Sec 15.12.1 强>
对于要搜索的类或接口,有六种情况需要考虑,具体取决于MethodInvocation左括号前面的表单:
如果表单是MethodName,即只是一个标识符,那么:
- 如果标识符出现在具有该名称的可见方法声明的范围内(§6.3,§6.4.1),则:
- 如果存在该方法为成员的封闭类型声明,则让T为最内层的类型声明。要搜索的类或接口是T.
- ...
所以T
是DrawPanel
。
<强> Sec 15.12.2.1 强>
搜索由编译时步骤1(第15.12.1节)确定的类或接口,以查找可能适用于此方法调用的所有成员方法;从超类和超接口继承的成员包含在此搜索中。
因此,在addMouseListener
及其所有超类中搜索名为DrawPanel
的方法。