UIクラスがFrame
またはDialog
の場合、実行時のサイズと位置を制御できます。サイズおよび位置は、UIウィンドウ作成時のコードによる設定と、ユーザーがサイズおよび位置変更のために行う操作で決まります。
UIウィンドウを作成し、様々なコンポーネントを追加する場合、追加した各コンポーネントがウィンドウ全体のpreferredSize
に影響を与え、通常、コンポーネントを追加するに従い、ウィンドウ・コンテナのpreferredSize
が大きくなります。preferredSize
に対する影響は、外側のコンテナのレイアウト・マネージャ、およびネストしたコンテナのレイアウトによって異なります。各種レイアウトに対するpreferredLayoutSize
を計算する方法の詳細は、このドキュメントの各レイアウトに関するセクションを参照してください。
UIウィンドウのサイズは、ユーザーがサイズ変更を行うまで、プログラムで設定されたとおりであり、コードの最後で次のコンテナ・メソッドのどれをコールするかによって決まります。
pack()
setSize()
実行時のUIの位置は、コンテナのlocation
プロパティを設定(たとえば、表示する前にsetLocation()
をコール)してオーバーライドしないかぎり、「0,0」になります。
pack()
によるウィンドウ・サイズの自動設定
pack()
メソッドでは、含まれているコンポーネントに基づいてウィンドウのpreferredSize
を計算し、適宜サイズを設定します。pack()
は、中に配置されたコンポーネントのpreferredSize
を優先しつつ、可能なかぎり最小のウィンドウを作成します。
注意: 「新規アプリケーション」ダイアログで作成されたApplication.javaファイルではpack()
がコールされ、表示する前にフレームをpreferredSize
に調整します。
コンテナについてのpreferredSize
の計算
preferredSize
の計算方法は、レイアウトが異なるコンテナごとに違います。
移植可能なレイアウト
FlowLayout
やBorderLayout
などの移植可能なレイアウトでは、レイアウト規則と、コンテナに追加された各コンポーネントのpreferredSize
の組合せに基づき、それぞれのpreferredSize
が計算されます。コンポーネントがコンテナ(Panel
など)の場合は、Panel
のpreferredSize
がそのレイアウトとコンポーネントに応じて計算されます。レイアウトの計算は、ネストされたコンテナの必要な層の数だけ繰り返されます。レイアウトのpreferredSize
の計算の詳細は、個々のレイアウトの説明を参照してください。
XYLayout
XYLayout
コンテナの場合、コンテナのpreferredSize
は、XYLayout
のwidthプロパティおよびheightプロパティで指定した値により定義されます。たとえば、コンテナの初期化に次のコードが指定されているとします。
xYLayoutN.setWidth(400);
xYLayoutN.setHeight(300);
さらに、xYLayoutN
がコンテナのレイアウト・マネージャであり、そのpreferredSizeが400×300ピクセルであるとします。
UI内のネストしたパネルの1つでXYLayout
を使用している場合、そのパネルのpreferredSizeは、レイアウトのsetWidth()
およびsetHeight()
のコールによって決まります。この値は、次(外側)のコンテナのpreferredSize
を計算する際、そのパネルに使用されます。
setSize()
を使用したウィンドウ・サイズの明示的設定
コンテナに対して(pack()
のかわりに、またはpack()
をコールした後に)setSize()
をコールした場合、コンテナのサイズは、特定のサイズにピクセル単位で設定されます。setSize()
によって、コンテナについてのpack()
およびpreferredSize
の設定がオーバーライドされます。
重要: ピクセル・サイズは画面ごとに異なるため、setSize()
を使用する場合は、子のコンテナが正しくレイアウトされるよう、validate()
をコールしてください。pack()
では、validate()
が自動的にコールされます。
UIのサイズを各種プラットフォームに移植可能に設定
UIを移植可能にするには、pack()
を使用するか、またはアプリケーションがデプロイされる各種画面のピクセル・サイズに基づいて、setSize()
により使用に適したサイズを計算します。
たとえば、画面の幅および高さの75%で、UIを表示するとします。このサイズ設定でUIを表示するには、pack()
をコールするかわりに、アプリケーション・クラスに次のコードを追加します。
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
frame.setSize(screenSize.width * 3 / 4, screenSize.height * 3 / 4);
注意: 移植性を確実にするには、プロトタイプ作成後、すべてのXYLayout
制約を移植可能なレイアウトに変更します。
ウィンドウの画面上での位置設定
UIの位置を明示的に設定しない場合、UIは画面の左上隅に表示されます。
画面上でUIを中央に配置するには、画面の幅および高さを求め、UIの幅および高さを引いて、差を2で割り(UIの両側、上下に均等な余白を作成するため)、これらの数を左上隅にあるUIに対して使用します。
次のコードは「新規アプリケーション」ダイアログの「フレームを画面の中央に配置」オプションを選択すると生成されるもので、この計算を実行します。
//Center the window
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
Dimension frameSize = frame.getSize();
if (frameSize.height > screenSize.height)
frameSize.height = screenSize.height;
if (frameSize.width > screenSize.width)
frameSize.width = screenSize.width;
frame.setLocation((screenSize.width- frameSize.width) / 2, (screenSize.height - frameSize.height) /2);
コードにサイズ設定および位置設定メソッドのコールを追加
pack()
、validate()
、setSize()
またはsetLocation()
のコールは、UIコンテナ・クラス内から(this.pack()
のようにして)作成できます。これらのコールは、コンストラクタを起動後、setVisible()
の前に、コンテナを作成するクラスからも(frame.pack()
のようにして)作成できます。後者は、「新規アプリケーション」ダイアログで生成されたコードで行われます。pack()
またはvalidate()
、およびsetLocation()
のコールは、フレームの作成後(jbInit()
へのコール後)に、Applicationクラスに追加されます。
アプリケーション内の様々な場所からUIを作成し、それを同じサイズで同じ位置に表示させる場合、UIコンテナ・クラスのコンストラクタに(jbInit()
へのコールの後)、独自のコールを入れてください。「新規アプリケーション」ダイアログで生成されるアプリケーションのように、アプリケーションでUIがインスタンス化される箇所が1箇所にかぎられる場合、サイズ設定および位置設定コードをUIが作成される場所(この例ではApplicationクラス)に入れてください。