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);
    }
}

スイングAPIは、JFrameクラスにjava.awt.Containerから継承されたaddという名前の5つのメソッドと、java.awt.Componentから継承された別のaddメソッドが含まれていると述べています。

**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)を持つ2つのオーバーロードされたメソッドがあると予想しました。しかし、そうではないので、1行目はadd(String、Component)を呼び出し、2行目はadd(Component、Object)を呼び出すと仮定します。

また、呼び出されたメソッドがどのように実装されているかについて、誰かに説明してもらえますか。APIのソースを見てこれを理解しようとしましたが、メソッド呼び出しチェーンは迷路のようなものであり、以前にそこにいた人のガイダンスを使用できました。

4

1 に答える 1

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)についてリスナーに通知します

追加

「追加」メソッドはデコレータです。それらは、単一のメソッドにフィルターする多数のエントリーメソッドを提供します。これは、そこでの作業のコンテキストに基づいて、開発者の生活をより簡単にすることを目的としています。

于 2013-02-06T06:13:05.377 に答える