import javax.swing.*;
class Foo{
public static void main(String args[]){
JFrame f=new JFrame();
f.add("North",new JButton()); //Line 1
f.add(new JButton(),"North"); //Line 2
f.setVisible(true);
}
}
swing API声明JFrame类包含5个名为add的方法,它们继承自java.awt.Container,另一个方法继承自java.awat.Component.
**Their signatures are as follows:**
*Inherited from java.awt.Container*
add(Component)
add(Component,int)
add(Component,Object)
add(Component,Object,int)
add(String,Component)
*Inherited from java.awt.Component*
add(java.awt.PopupMenu)
我预计在API中会有两个重载方法,分别带有签名add(Component,String(和add(String,Component(。但是,鉴于情况并非如此,我假设第1行调用add(String,Component(,第2行调用add(Component,Object(。
另外,有人能给我解释一下被调用的方法是如何实现的吗。我试图通过查看API的来源来了解这一点,但方法调用链就像一个迷宫,我可以使用以前去过那里的人的指导。
最终,它们都调用Container#addImpl(Component, Object, int)
,而不是add(PopupMenu)
add(Component)
调用addImpl(comp, null, -1)
add(String, Component)
调用addImpl(comp, name, -1)
add(Component, int)
调用addImpl(comp, null, index)
add(Component, Object)
调用addImpl(comp, constraints, -1)
add(Component, Object, int)
调用addImpl(comp, constraints, index)
addImpl
做了很多工作。。。
它确保;
- 组件是自己添加到其中的
- 组件不是类型
Window
(因为您无法将窗口添加到组件中( - 组件的图形配置相同
- 组件尚未包含在现有容器中,如果已包含,则将其删除
- 组件已添加到有效索引范围内(如果
index
>-1(
然后。。。
- 将组件添加到此容器管理的组件列表中
- 调用组件的
addNotify
方法(如果容器在屏幕上实现( - 通知布局管理器新添加的组件
- 通知任何侦听器容器事件(
componentAdded
(和层次结构事件(hierarchyChanged
(
额外
"add"方法是decorator。它们提供了许多筛选为单个方法的入口方法,旨在根据工作的上下文简化开发人员的生活。