在Java中使用此方法调用时调用的方法是什么


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。它们提供了许多筛选为单个方法的入口方法,旨在根据工作的上下文简化开发人员的生活。

最新更新