本文へジャンプ

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む


お客様が developerWorks に初めてサインインすると、プロフィールが作成されます。プロフィールで選択した情報は公開されますが、いつでもその情報を編集できます。お客様の姓名(非表示設定にしていない限り)とディスプレイ・ネームは、投稿するコンテンツと一緒に表示されます。

送信されたすべての情報は安全です。

  • 閉じる [x]

developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む


送信されたすべての情報は安全です。

  • 閉じる [x]

Merlinの魔術: SpringLayoutマネージャ

GridBagLayoutでは不十分なとき

John Zukowski (jaz@zukowski.net), President, JZ Ventures, Inc.
Author photo
John Zukowskiは、JZ Ventures, Inc.の戦略的Javaコンサルティングを推進し、数多くのjGuruのコミュニティー主導のJava FAQsで常任指導者として活躍しています。最新の著書には、Apressから出版された「 Java Collections」および「 Definitive Guide to Swing for Java 2」 (第2版) があります。彼のメール・アドレスはjaz@zukowski.net です。

概要: 複雑な画面を設計するときに、強力なGridBagLayoutマネージャを使おうとしない開発者がたくさんいます。彼らはGridBagConstraintsをいじくり回すよりも、BorderLayoutのようなレイアウト・マネージャで、パネルの下にパネルを埋め込んでしまいます。別の方法として、新たに導入されたSpringLayoutマネージャを使うと、コンポーネントをお互い相対的に配置できるようになります。この記事ではMerlinのベテランであるJohn Zukowskiが、この新しいレイアウト・マネージャの使い方をお見せします。

日付:  2003年 9月 17日
レベル:  初級 この記事の原文:  英語
アクティビティー: 1313 ビュー
お気軽にご意見・ご感想をお寄せください: 


Javaレイアウト・マネージャ前線に加わった最新のものが、Java 1.4リリースで追加されたSpringLayoutマネージャです。このレイアウト・マネージャを使うと、コンポーネントに「スプリング(ばね)」を付加し、そのコンポーネントを他のコンポーネントに相対的に配置できるようになります。例えばSpringLayoutを使うことで、ユーザーが画面サイズをどう変えても、ボタンが常に画面の右枠に貼りついて見えるようにすることができるのです。

SpringLayoutを使い始める

他のレイアウト・マネージャと同様、SpringLayoutはコンポーネントを配置する役割を担います。コンポーネントの位置は、そのコンポーネントに関連付けられた制限で制御されます。SpringLayoutで制御された各コンポーネントには、4つの設定項目(各コンポーネントの4つのエッジに対応)を持った一つの制限があります。SpringLayoutマネージャは、これらコンポーネントの制限に関してSpringLayout.Constraintsオブジェクトをもとに動作します。これはGridBagLayoutマネージャを補完するGridBagConstraintsクラスと似たような形で動きます。つまりコンテナに追加された各コンポーネントは、SpringLayout.Constraintsオブジェクトを付加として持ち得るのです。ただし似ているのはこの点だけです。

GridBagLayoutでは普通、制限を付加してコンポーネントをコンテナに追加しますが、SpringLayoutマネージャでは通常、コンポーネントに制限を付加する必要がなく、コンポーネントを追加し、そのあと別途制限を付加する、ということができるのです。コンポーネントに制限を追加しても構わないのですが、SpringLayout.Constraintsは簡単なクラスではありません。SpringLayout.Constraintsは、(各エッジに対する)Springオブジェクトの集合であり、その各オブジェクトがコンポーネントに対して異なる制限となっているのです。これを使うには、各Spring制限を別々にSpringLayout.Constraintsに追加する必要があります。コンポーネントの、ある一つのエッジに特定の制限を設定することで、SpringLayout.Constraintsに制限が「追加」されます。SpringLayoutの4つの定数、EAST,WEST,NORTHSOUTHを使ってSpringLayout.ConstraintssetContraints(String edge, Spring spring)メソッドを呼びます。ここでStringは定数の一つです。例えばコンテナ上部の左にコンポーネントを追加したいならば、一定サイズの2つのスプリングを設定、その2つを組み合わせ、その組み合わせたものを付加して、そのコンポーネントをコンテナに追加します。リスト1にこれを示します。


リスト1 SpringLayoutを使う
                
Component left = ...;
SpringLayout layout = new SpringLayout();
JPanel panel = new JPanel(layout);
Spring xPad = Spring.constant(5);
Spring yPad = Spring.constant(25);
SpringLayout.Constraints constraint = new SpringLayout.Constraints();
constraint.setConstraint(SpringLayout.WEST, xPad);
constraint.setConstraint(SpringLayout.NORTH, yPad);
contentPane.add(left, constraint);

これはそれほど難しくないように見えるかもしれませんが、その次のコンポーネントを、最初に置いたコンポーネントの右や下に追加しようとすると、もっと難しくなってきます。コンポーネントを単にn ピクセル単位の指定で追加することはできず、先に置いたコンポーネントのエッジに、実際にパディングを追加しなければならないのです。先に置いたコンポーネントのエッジを見つけるにはgetConstraint()を使ってレイアウト・マネージャに問い合わせます。具体的にはlayout.getConstraint(SpringLayout.EAST, left)のようにそのコンポーネントと必要なエッジとをレイアウト・マネージャに渡し、最初のコンポーネントの右エッジ位置を取得するのです。そうした後、必要なパディングを追加し、そのパディングを後から追加するコンポーネントのエッジに付加します。これをリスト2に示します。


リスト2 SpringLayoutで2番目のコンポーネントを追加する
                
Component right = ...;
Spring rightSideOfLeft = layout.getConstraint(SpringLayout.EAST, left);
Spring pad = Spring.constant(20);
Spring leftEdgeOfRight = Spring.sum(rightSideOfLeft, pad);
constraint = new SpringLayout.Constraints();
constraint.setConstraint(SpringLayout.WEST, leftEdgeOfRight);
constraint.setConstraint(SpringLayout.NORTH, yPad);
contentPane.add(right, constraint);


SpringLayoutでputConstraint()を使う

このやり方で全く問題なく動くのですが、コンポーネントの数が増えてくると非常に手間がかかることになります。代わりの手段として中間のステップを回避する方法があります。コンポーネントを制限の付加無しに追加し、SpringLayoutputConstraint()メソッドを使って後から各制限を別々に追加することでコンポーネントを連結するという、リスト3に示すような方法です。


リスト3 SpringLayoutで2番目のコンポーネントを追加する
                
public void putConstraint(String e1, Component c1, int pad, String e2, Component c2)
public void putConstraint(String e1, Component c1, Spring s, String e2, Component c2)

ここでは、エッジを問い合わせ、自分でパディングを追加しなくても、putConstraint()へのコールがその二つを処理します。これをお見せするためにリスト4では、リスト3のコンポーネント制限と同じコンポーネント制限を右のコンポーネントに追加しますが、SpringLayout.Constraintsを直接使う代わりにputConstraint()を使っています。


リスト4 putConstraint()を使って2番目のコンポーネントを追加する
                
Component left = ...;
Component right = ...;
SpringLayout layout = new SpringLayout();
JPanel panel = new JPanel(layout);
panel.add(left);
panel.add(right);
layout.putConstraint(SpringLayout.WEST, left, 5, SpringLayout.WEST, panel);
layout.putConstraint(SpringLayout.NORTH, left, 25, SpringLayout.NORTH, panel);
layout.putConstraint(SpringLayout.NORTH, right, 25, SpringLayout.NORTH, panel);
layout.putConstraint(SpringLayout.WEST, right, 20, SpringLayout.EAST, left);

putConstraint()のString引数はSpringLayoutの4つの定数、EAST、WEST、NORTH、SOUTHです。putConstraint()を使うときには必ず未知のコンポーネント位置をまず規定し、それを何か計算できるもの、又は(画面の枠など)固定したものに接続します。


BeanBuilderでSpringLayoutを使いこなす

SpringLayoutを視覚化するために、SunではBeanBuilder(参考文献)と呼ぶツールを用意しています。このツールはむしろJavaBeansコンポーネントを使う時のためのものですが、SpringLayoutを簡単にいろいろ試すこともできるようになっています。このツールが起動時にどう見えるかを図1に示します。


図1 BeanBuilderの起動画面
 BeanBuilder Startup Screen

このツールの具体的なことについては取り上げませんが、一点だけ、BeanBuilderを使うことでコンポーネントをSpringLayoutで接続できるようになるのです。各コンポーネントのエッジ周辺には東西南北それぞれに4つの箱があります。一つの箱から矢印をドラッグし、どれか別の箱につなぐことができるのです。このツールがもうちょっと賢ければ、ギャップのサイズまで規定できるところなのですが、図2では開発途中で画面がどんな風に見えるかを示しています。


図2 BeanBuilderの使用画面
 BeanBuilder Usage Screen

図2で分かる通り、矢印を特定のputConstraint()コールに視覚的に接続できるのです。


完全なSpringLayoutの例

リスト5にあるのはSpringLayoutの使い方をお見せするために、ここでの説明に挙げた諸々をputConstraint()を使って接続するSpringFormTestプログラムです。(このコードをダウンロードできます。参考文献を見てください)


リスト5 完全なSpringLayoutの例
                
import java.awt.*;
import javax.swing.*;
public class SpringFormTest {
  public static void main(String args[]) {
    JFrame frame = new JFrame("Spring Form");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    Container contentPane = frame.getContentPane();
    SpringLayout layout = new SpringLayout();
    contentPane.setLayout(layout);
    Component left = new JLabel("Left");
    Component right = new JTextField(15);
    contentPane.add(left);
    contentPane.add(right);
    layout.putConstraint(SpringLayout.WEST,  left, 10,
      SpringLayout.WEST,  contentPane);
    layout.putConstraint(SpringLayout.NORTH, left, 25,
      SpringLayout.NORTH, contentPane);
    layout.putConstraint(SpringLayout.NORTH, right, 25,
      SpringLayout.NORTH, contentPane);
    layout.putConstraint(SpringLayout.WEST, right, 20,
      SpringLayout.EAST, left);
    frame.setSize(300, 100);
    frame.show();
  }
}

図3はその結果を示します。


図3 SpringFormTestの画面
 SpringFormTest Example Screen

参考文献

  • この記事で使われているサンプル・コードをダウンロードして下さい。

  • Merlinの魔術  全ヒント集もお読み下さい。

  • BeanBuilder ツールを使うと、コード無しにSpringLayoutをいろいろ試すことができます。

  • SpringLayout クラスのJavadocを読んで下さい。

  • GridBagLayout クラスのJavadocを読んで下さい。

  • 優れたGUIを構築する」(developerWorks , 2001年10月)をよく読んで下さい。Javaレイアウト・マネージャがいかにGUIデザインや設計プロセスを改善するかを学べるはずです。

  • チュートリアル「Developing accessible GUIs with Swing 」(developerWorks 2002年12月)を読んでSection 508アクセシビリティ(身障者対応を促進するアメリカの法令)対応の設計についても勉強してください。

  • Sunの SpringLayout tutorialもぜひ読んでください。

  • developerWorks のJava technology ゾーンには、Javaプログラミングのあらゆる側面に関する記事が豊富にあります。

著者について

Author photo

John Zukowskiは、JZ Ventures, Inc.の戦略的Javaコンサルティングを推進し、数多くのjGuruのコミュニティー主導のJava FAQsで常任指導者として活躍しています。最新の著書には、Apressから出版された「 Java Collections」および「 Definitive Guide to Swing for Java 2」 (第2版) があります。彼のメール・アドレスはjaz@zukowski.net です。

不正使用の報告のヘルプ

不正使用の報告

ありがとうございます。 このエントリーは、モデレーターの注目フラグが設定されました。


不正使用の報告のヘルプ

不正使用の報告

不正使用の報告の送信に失敗しました。


developerWorks: サイン・イン


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 利用条件

 


お客様が developerWorks に初めてサインインすると、プロフィールが作成されます。 プロフィールで選択した情報は公開されますが、いつでもその情報を編集できます。 お客様の姓名(非表示設定にしていない限り)とディスプレイ・ネームは、投稿するコンテンツと一緒に表示されます。

表示名をお選びください

developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

(半角英数字で3文字以上31文字以下にする必要があります)


「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 利用条件

 


この記事を評価する

コメント

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Java technology
ArticleID=218843
ArticleTitle=Merlinの魔術: SpringLayoutマネージャ
publish-date=09172003
author1-email=jaz@zukowski.net
author1-email-cc=jaloi@us.ibm.com

タグ

Help
このタグで、My developerWorks のすべてのタイプのコンテンツを見つけるために検索フィールドを使用します。

スライダーバーを使用することで、より多く(少なく)タグを表示します。

人気のタグは、この特定のコンテンツ・ゾーン(例えば、Java テクノロジー、Linux や WebSphere など)に対するトップのタグを表示します。

マイ・タグは、この特定のコンテンツ・ゾーン(例えば、Java テクノロジー、Linux や WebSphere など)に対するお客様ご自身のタグを表示します。

このタグで、My developerWorks のすべてのタイプのコンテンツを見つけるために検索フィールドを使用します。人気のタグは、この特定のコンテンツ・ゾーン(例えば、Java テクノロジー、Linux や WebSphere など)に対するトップのタグを表示します。マイ・タグは、この特定のコンテンツ・ゾーン(例えば、Java テクノロジー、Linux や WebSphere など)に対するお客様ご自身のタグを表示します。