1
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,另一个 add 方法继承自 java.awt.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 的源来弄清楚这一点,但是方法调用链就像一个迷宫,我可以使用以前去过那里的人的指导。

4

1 回答 1

5

Eventaully,他们都打电话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)

额外的

“添加”方法是装饰器。它们提供了许多过滤到单个方法的入口方法,旨在使开发人员的生活更简单,基于那里的工作环境。

于 2013-02-06T06:13:05.377 回答