JFrameフレームを埋める3つの方法を見つけました= new JFrame( "...")createContentPanelはJPanelを返し、createToolBarはToolBarを返します。
frame.add(this.createToolBar(), BorderLayout.PAGE_START); //this works and puts the ToolBar above and the ContentPanel under it<br>
frame.add(this.createContentPanel(), BorderLayout.CENTER);
frame.setContentPane(this.createContentPanel()); //this lets the JToolBar hover over the ContentPanel
frame.getContentPane().add(this.createToolBar());
frame.getContentPane().add(this.createContentPanel()); //this only puts the last one into the JFrame
frame.getContentPane().add(this.createToolBar());
そして今、単純なframe.add(...)を使用してフレームを埋めることができるのに、なぜgetContentPane()/ setContentPane()メソッドを使用する必要があるのか疑問に思っています。
どちらを使用しても(JFrame#add(...)
とJFrame#getContentPane().add(...)
)は基本的に同じコードを呼び出すため、どちらを使用してもかまいませんが、将来的には境界線を変更したり、背景色を設定したり、サイズを決定したりする場合など、contentPane自体にアクセスする必要があります。そのため、ある時点でgetContentPane()を使用して、それを理解し、慣れることができます。それで役に立ちます。
//これは最後のものだけをJFrameに入れます
レイアウトマネージャーがどのように機能するかを理解する必要があります。デフォルトのコンテンツペインは、BorderLayoutを使用するJPanelです。コンポーネントを追加し、制約を指定しない場合、デフォルトでCENTERになります。ただし、中央に配置できるコンポーネントは1つだけなので、レイアウトマネージャーは最後に追加されたコンポーネントのみを認識します。レイアウトマネージャーが呼び出されると、そのコンポーネントのsize()とlocation()が設定されます。他のコンポーネントのサイズは0であるため、ペイントされることはありません。
Java 1.6では、JFrameのadd
メソッドを使用できます: http://download.Oracle.com/javase/6/docs/api/ javax/swing/JFrame.html (contentPaneに委任されます。)
http://download.Oracle.com/javase/1.4.2/docs/api/javax/swing/JFrame.html
それは言う:
JFrameクラスはFrameとわずかに互換性がありません。他のすべてのJFC/Swingトップレベルコンテナと同様に、JFrameには唯一の子としてJRootPaneが含まれています。ルートペインによって提供されるコンテンツペインには、原則として、JFrameによって表示されるすべての非メニューコンポーネントが含まれている必要があります。これは、AWTフレームの場合とは異なります。たとえば、AWTフレームに子を追加するには、次のように記述します。
frame.add(child);
ただし、JFrameを使用する場合は、代わりに子をJFrameのコンテンツペインに追加する必要があります。
frame.getContentPane().add(child);
レイアウトマネージャーの設定、コンポーネントの削除、子の一覧表示などについても同じことが言えます。これらのメソッドはすべて、通常、JFrame自体ではなくコンテンツペインに送信する必要があります。コンテンツペインは常にnull以外になります。 nullに設定しようとすると、JFrameは例外をスローします。デフォルトのコンテンツペインには、BorderLayoutマネージャーが設定されています。