実行時のUIウィンドウのサイズと位置の決定

UIクラスがFrameまたはDialogの場合は、サイズと位置を実行時に制御できます。サイズと位置は、UIウィンドウ作成時のコードの内容と、ユーザーがサイズ変更または再配置のために実行する操作によって決定されます。

UIウィンドウを作成して各種コンポーネントを追加すると、追加した各コンポーネントがウィンドウ全体のpreferredSizeに影響し、通常はコンポーネントを追加するたびにウィンドウ・コンテナのpreferredSizeが大きくなります。このpreferredSizeに対する効果は、外側のコンテナのレイアウト・マネージャおよびネストしたコンテナのレイアウトによって異なります。各種レイアウトのpreferredLayoutSizeの計算方法の詳細は、このドキュメントの各レイアウト・タイプの項を参照してください。

UIウィンドウのサイズはプログラムにより(ユーザーが追加のサイズ変更を行う前に)設定され、次のコンテナ・メソッドのうちコードで最後にコールされるメソッドにより決定されます。

実行時のUIの位置は、コンテナのlocationプロパティを(たとえば参照可能にする前にsetLocation()をコールして)設定してオーバーライドしなければ、0,0になります。

pack()による自動的なウィンドウ・サイズ設定

pack()メソッドでは、中に含まれているコンポーネントに基づいてウィンドウのpreferredSizeが計算され、計算結果に従ってウィンドウ自体のサイズが設定されます。pack()では中に配置されたコンポーネントのpreferredSizeも考慮した上で、可能な範囲内で最小のウィンドウが作成されます。

注意: 「新規アプリケーション」ダイアログで作成されるApplication.javaファイルでは、pack()がコールされ、フレームは参照可能になる前にpreferredSizeまで圧縮されます。

コンテナのpreferredSizeの計算方法

preferredSizeの計算方法は、コンテナとレイアウトによって異なります。

移植性のあるレイアウト

移植性のあるレイアウト(FlowLayoutBorderLayoutなど)のpreferredSizeは、レイアウト・ルールとコンテナに追加された各コンポーネントのpreferredSizeの組合せに基づいて計算されます。コンポーネントのいずれかがコンテナ(Panelなど)の場合、そのPanelpreferredSize はレイアウトおよびコンポーネントに従って計算されます。レイアウトの計算は、必要に応じてネストしたコンテナのレイヤーの数だけ再帰的に繰り返されます。特定のレイアウトに関するpreferredSizeの計算の詳細は、そのレイアウトの説明を参照してください。

XYLayout

XYLayoutコンテナのpreferredSizeは、XYLayoutのwidthおよびheightプロパティの指定値で定義されます。たとえば、コンテナの初期化中に次のコード行があるとします。

xYLayoutN.setWidth(400);
xYLayoutN.setHeight(300);

この場合、xYLayoutNがコンテナのレイアウト・マネージャであれば、そのpreferredSizeは400 x 300ピクセルとなります。

UI内のネストしたパネルの1つにXYLayoutが使用されている場合、そのパネルのpreferredSizeはレイアウトのsetWidth()コールとsetHeight()コールによって決定されます。この値は、次(外側)のコンテナのpreferredSizeを計算する際にパネルに使用されます。

setSize()によるウィンドウ・サイズの明示的な設定

コンテナに対して(pack()または以降のpack()のコールではなく)setSize()をコールすると、コンテナのサイズはピクセル単位で特定のサイズに設定されます。setSize()により、コンテナに対するpack()およびpreferredSizeの効果がオーバーライドされます。

重要: ピクセル・サイズは画面ごとに異なるため、setSize()を使用する場合は、子コンテナが正しくレイアウトされるようにvalidate()をコールする必要があります。pack()が自動的にvalidate()をコールすることに注意してください。

各種プラットフォームに移植可能にするためのUIのサイズ設定

UIを移植可能にするには、pack()を使用するか、アプリケーションがデプロイされる各種画面のピクセル・サイズに基づいてsetSize()で使用する適切なサイズを計算します。

たとえば、UIを画面の幅と高さの75%で表示するとします。UIがこのサイズで表示されるように、pack()をコールするかわりにアプリケーション・クラスに次のコード行を追加できます。

Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
frame.setSize(screenSize.width * 3 / 4, screenSize.height * 3 / 4);

注意: 移植性を保証するために、すべてのXYLayoutコンテナをプロトタイプ作成後に移植可能なレイアウトに変更します。

画面上のウィンドウ配置

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()など)の内側からコールできます。これらのコールは、コンテナを作成するクラス(frame.pack()など)から、コンストラクタの起動後、setVisible()の前に実行することもできます。後者は、「新規アプリケーション」ダイアログで生成されたコードの動作です。pack()またはvalidate()およびsetLocation()は、フレームの作成後(jbInit()のコール後)にApplicationクラスに配置されます。

アプリケーション内の様々な場所からUIを作成し、そのUIのサイズと位置を同じにする場合は、コールをUIコンテナ・クラスのコンストラクタ(jbInit()のコールの後)に挿入します。「新規アプリケーション」ダイアログで生成されたアプリケーションのように、アプリケーションで1箇所からのみUIがインスタンス化される場合は、サイズ設定コードと配置コードをUIの作成場所(この場合はApplicationクラス)に挿入します。