2013-02-06 83 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

額外

「添加」 方法是裝飾。他們提供了多種入口方法,可以過濾到單一方法,這樣可以根據工作環境簡化開發人員的生活。

相關問題