実行時の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×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クラス)に入れてください。

 

Copyright © 1997, 2004, Oracle Corporation. All rights reserved.