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

时间:2013-02-06 05:55:18

标签: java swing jframe

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的来源来解决这个问题,但是方法调用链就像一个迷宫,我可以使用之前曾经去过那里的人的指导。

1 个答案:

答案 0 :(得分:5)

最后,他们都致电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

额外

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