• 追加された行はこの色です。
  • 削除された行はこの色です。
TITLE:SpringLayoutでリスト状に並べる
TITLE:SpringLayoutの使用
#navi(../)
*SpringLayoutでリスト状に並べる [#nc4396b2]
*SpringLayoutの使用 [#sf3d3df1]
>編集者:[[Terai Atsuhiro>terai]]~
作成日:2004-03-22~
作成日:2006-06-15~
更新日:&lastmod;

#contents

**概要 [#k994c8ea]
高さの異なるコンポーネントをリスト状に並べてみます。
**概要 [#y6dd9c25]
レイアウトにSpringLayoutを使用します。

#screenshot

**サンプルコード [#gefca96e]
 public void addComp(JComponent label) {
**サンプルコード [#a420aa84]
 public void initLayout() {
   SpringLayout layout = new SpringLayout();
   Component[] list = pnl.getComponents();
   if(list.length==0) {
     layout.putConstraint(
           SpringLayout.WEST,label,0,SpringLayout.WEST,pnl);
     layout.putConstraint(
           SpringLayout.NORTH,label,0,SpringLayout.NORTH,pnl);
   }else{
     JComponent cmp = null;
     for(int i=0;i<list.length;i++) {
       JComponent tmp = (JComponent)list[i];
       layout.putConstraint(
             SpringLayout.WEST,tmp,0,SpringLayout.WEST,pnl);
       if(cmp==null) {
         layout.putConstraint(
               SpringLayout.NORTH,tmp,0,SpringLayout.NORTH,pnl);
       }else{
         layout.putConstraint(
               SpringLayout.NORTH,tmp,0,SpringLayout.SOUTH,cmp);
       }
       cmp = tmp;
     }
     layout.putConstraint(
           SpringLayout.WEST,label,0,SpringLayout.WEST,pnl);
     layout.putConstraint(
           SpringLayout.NORTH,label,0,SpringLayout.SOUTH,cmp);
   }
   pnl.add(label);
   pnl.setLayout(layout);
   initComps();
   Insets i = panel.getInsets();
   int w = panel.getWidth()  - i.left - i.right;
   int h = panel.getHeight() - i.top  - i.bottom;
 
   l1.setPreferredSize(new Dimension( w*90/100, h*55/100 ) );
   l2.setPreferredSize(new Dimension( w*40/100, h*30/100 ) );
 
   layout.putConstraint(SpringLayout.WEST,  l1, w*5/100,
                        SpringLayout.WEST,  panel);
   layout.putConstraint(SpringLayout.NORTH, l1, h*5/100,
                        SpringLayout.NORTH, panel);
   layout.putConstraint(SpringLayout.WEST,  l2, w*50/100,
                        SpringLayout.WEST,  panel);
   layout.putConstraint(SpringLayout.SOUTH, l2, -h*5/100,
                        SpringLayout.SOUTH, panel);
 
   panel.setLayout(layout);
   panel.revalidate();
 }

 public void initComps() {
   Rectangle rv = scroll.getViewport().getViewRect();
   Insets ins = pnl.getInsets();
   int cw = (int)rv.getWidth() - ins.left - ins.right;
   int ch = 0;
   Component[] list = pnl.getComponents();
   for(int i=0;i<list.length;i++) {
     JComponent tmp = (JComponent)list[i];
     int th = tmp.getPreferredSize().height;
     tmp.setPreferredSize(new Dimension(cw, th));
     ch = ch + th;
   }
   Dimension d = new Dimension(
                   (int)rv.getWidth(),ch+ins.top+ins.bottom);
   pnl.setPreferredSize(d);
   pnl.revalidate();
 }

-&jnlp;
-&jar;
-&zip;

**解説 [#b910d821]
上記のサンプルでは、SpringLayoutを使ってパネルにコンポーネントを並べています。右クリックのポップアップメニューから、高さの異なるラベルとボタンを追加することができます。追加されたコンポーネントの幅はJListのようにViewportに合わせて変化しますが、高さはsetPreferredSize()で設定されたものを維持します。
**解説 [#he0e3381]
上記のサンプルでは、SpringLayoutを使って2つのラベルをパネル内にレイアウトしています。

チュートリアルの[[SpringForm>http://java.sun.com/docs/books/tutorial/uiswing/layout/example-1dot4/index.html#SpringForm]]にある[[SpringUtilities.java>http://java.sun.com/docs/books/tutorial/uiswing/layout/example-1dot4/SpringUtilities.java]]を使用すると、サンプルのaddCompメソッドは以下のように書くこともできます。
 public void addComp2(JComponent cmp) {
   pnl.add(cmp);
   Component[] list = pnl.getComponents();
   SpringUtilities.makeCompactGrid(pnl,
                                   list.length, 1, //rows, cols
                                   6, 6,           //initX, initY
                                   6, 6);          //xPad, yPad
   initComps();
 }
パネルのサイズが変更されるたびに、各ラベルのサイズとパネルからの距離が一定の割合になるように設定し直しています(ただしパネルの余白は無視)。

-JLabel1
--幅はパネルの90%、高さは55%
--パネルと自身のWESTからの距離5%、パネルと自身のNORTHからの距離5%
-JLabel2
--幅はパネルの40%、高さは30%
--パネルと自身のWESTからの距離50%、パネルと自身のSOUTHからの距離-5%

SpringLayoutでは原点は左上で、右方向、下方向に正の値を取る為、例えばパネルの南辺からコンポーネントの南辺までの距離を指定する場合は、layout.putConstraintする際にマイナスの値を指定する必要があります。

//**参考リンク
**コメント [#eec7c049]
**コメント [#v98c3ed9]
- 以前の内容は[[Swing/ComponentList]]に移動しました。 -- [[terai]] &new{2006-06-15 (木) 19:40:17};

#comment