web-dev-qa-db-ja.com

JAVA:フレームを埋める方法。 add()、setContentPane()、getContentPane()

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()メソッドを使用する必要があるのか​​疑問に思っています。

13
froehli

どちらを使用しても(JFrame#add(...)JFrame#getContentPane().add(...))は基本的に同じコードを呼び出すため、どちらを使用してもかまいませんが、将来的には境界線を変更したり、背景色を設定したり、サイズを決定したりする場合など、contentPane自体にアクセスする必要があります。そのため、ある時点でgetContentPane()を使用して、それを理解し、慣れることができます。それで役に立ちます。

//これは最後のものだけをJFrameに入れます

レイアウトマネージャーがどのように機能するかを理解する必要があります。デフォルトのコンテンツペインは、BorderLayoutを使用するJPanelです。コンポーネントを追加し、制約を指定しない場合、デフォルトでCENTERになります。ただし、中央に配置できるコンポーネントは1つだけなので、レイアウトマネージャーは最後に追加されたコンポーネントのみを認識します。レイアウトマネージャーが呼び出されると、そのコンポーネントのsize()とlocation()が設定されます。他のコンポーネントのサイズは0であるため、ペイントされることはありません。

2
camickr

Java 1.6では、JFrameのaddメソッドを使用できます: http://download.Oracle.com/javase/6/docs/api/ javax/swing/JFrame.html (contentPaneに委任されます。)

2
Alan

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マネージャーが設定されています。

0
mvmn