2012-04-10 22 views
1

私は、両者が両方とも機能しているように見せかけますが、他のものよりも優れた方法があるかどうかは疑問です。 myFrameあなたができると呼ばれるJFrameと例えばJava - JFrameにコンポーネントを追加する

、:

myFrame.add(new JButton("OK")); 

そして、あなたも行うことができます。

Container c = myFrame.getContentPane(); 
c.add(new JButton("OK")); 

は、これらの '正しい' の一つですか?

答えて

5

JFrame

たJFrameクラスのクラスのjavadocから文字通りのコピーは、フレームと、わずかに互換性がありません。ほかのすべてのJFC/Swingトップレベルコンテナと同様に、JFrameには唯一の子としてJRootPaneが含まれています。ルートペインが提供するコンテンツペインには、通常、JFrameによって表示されるすべての非メニューコンポーネントが含まれている必要があります。これは、AWTフレームの場合とは異なります。コンビネーションaddおよびその変形として、removeおよびsetLayoutは、必要に応じてcontentPaneに転送するようにオーバーライドされました。これは、あなたが書くことができることを意味:

frame.add(child); 

そして子供がcontentPaneに追加されます。コンテンツペインは常にnullではありません。それをnullに設定しようとすると、JFrameは例外をスローします。デフォルトのコンテンツペインには、BorderLayoutマネージャが設定されています。 JFrameのLayoutManagerの追加、削除、および設定の詳細については、RootPaneContainerを参照してください。

だから、両方とも同等であり、そして両方がJava5から

2

正しいかはちょうどJFrame.add(JComponent)

  • JFrameが実施している、ContentPaneJComponentsを追加する

    • を必要とされていませんBorderLayoutmyFrame.add(new JButton("OK"));CENTERエリアに配置されます

  • 1

    私はdefinetly

    Container c = myFrame.getContentPane(); 
    c.add(new JButton("OK")); 
    

    が最も実用的なものであると言うでしょう。後でもう一度書き込む必要はありませんので、後でコンテナを使用する必要があります。

    myFrame.getContentPane(); 
    

    たとえば、フレームの別のレイアウトを設定する必要がある場合に使用します。しかし、先に述べたように、どちらも使用できます。

    +1

    それぞれ不必要な文字はノイズであり、ノイズは維持できないコードにつながります:-) contentPaneのプロパティは直接的にしかアクセスできない(fi背景、不透明なものなど)がありますが、レイアウトはそれらのどれもそうではありません..咳が... – kleopatra

    関連する問題