2013-02-06 161 views
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和另一个继承自java.awt.Component的add方法。在Java中使用此方法调用时调用的方法是什么?

**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中会有两个带签名添加(Component,String)和add(String,Component)的重载方法。但看到这种情况并非如此,我认为第1行调用add(String,Component),第2行调用add(Component,Object)。

另外,任何人都可以给我一个关于如何执行被调用的方法的解释。我试图通过查看API的来源来弄清楚这一点,但方法调用链就像一个迷宫,我可以使用曾经在那里的人的指导。

+3

事实上,他们都调用['Container#addImpl(Component,Object,int)'](http://docs.oracle.com/javase/7/docs/api/java/awt/Container.html#addImpl %28java.awt.Component,%20java.lang.Object,%20int%29),期望'add(PopupMenu)' – MadProgrammer

+1

'add(Component,Object)'是这里唯一的候选重载。另外,你说的没错,只是调用另一种方法的方法在Java中是很常见的。 –

+0

我不明白你的问题 –

回答

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(因为你无法在Windows中添加组件)
  • 该组件的图形配置是一样的
  • 该组件尚未包含现有的容器内,并删除它,如果它是
  • 该组件被有效的索引范围内添加(如果index> -1)

它那么......

  • 将组件添加到组件列表被这个容器
  • 调用组件的方法addNotify(如果容器在屏幕上实现)
  • 通知已管理新添加组件的布局管理器
  • 通知任何收听者有关集装箱事件(componentAdded)和等级事件(hierarchyChanged

额外

“添加” 方法是装饰。他们提供了多种入口方法,可以过滤到单一方法,这样可以根据工作环境简化开发人员的生活。

相关问题