• 追加された行はこの色です。
  • 削除された行はこの色です。
TITLE:SpringLayoutの使用
#navi(../)
*SpringLayoutの使用 [#sf3d3df1]
>編集者:[[Terai Atsuhiro>terai]]~
作成日:2006-06-15~
更新日:&lastmod;
---
category: swing
folder: SpringLayout
title: SpringLayoutの使用
tags: [SpringLayout, LayoutManager]
author: aterai
pubdate: 2004-03-22T10:23:19+09:00
description: SpringLayoutを使用して、各ラベルのサイズとパネルからの距離が一定の比率になるような配置を指定します。
image: https://lh6.googleusercontent.com/_9Z4BYR88imo/TQTTwX9UR-I/AAAAAAAAAk8/TLNZjmIrPnw/s800/SpringLayout.png
---
* 概要 [#summary]
`SpringLayout`を使用して、各ラベルのサイズとパネルからの距離が一定の比率になるような配置を指定します。

#contents
#download(https://lh6.googleusercontent.com/_9Z4BYR88imo/TQTTwX9UR-I/AAAAAAAAAk8/TLNZjmIrPnw/s800/SpringLayout.png)

**概要 [#y6dd9c25]
レイアウトにSpringLayoutを使用します。
* サンプルコード [#sourcecode]
#code(link){{
private static void setScaleAndAdd(
    JComponent parent, SpringLayout layout, JComponent child,
    float sx, float sy, float sw, float sh) {
  Spring panelw = layout.getConstraint(SpringLayout.WIDTH,  parent);
  Spring panelh = layout.getConstraint(SpringLayout.HEIGHT, parent);

#screenshot
  SpringLayout.Constraints c = layout.getConstraints(child);
  c.setX(Spring.scale(panelw, sx));
  c.setY(Spring.scale(panelh, sy));
  c.setWidth(Spring.scale(panelw,  sw));
  c.setHeight(Spring.scale(panelh, sh));

**サンプルコード [#a420aa84]
#code{{
 public void initLayout() {
   SpringLayout layout = new SpringLayout();
   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.WEST, l2, 0, SpringLayout.WEST, l1);
   layout.putConstraint(SpringLayout.SOUTH, l2, -h*5/100,
                        SpringLayout.SOUTH, panel);
 
   panel.setLayout(layout);
   panel.revalidate();
 }
  parent.add(child);
}

// public void initLayout() {
//   SpringLayout layout = new SpringLayout();
//   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.WEST, l2, 0, SpringLayout.WEST, l1);
//   layout.putConstraint(SpringLayout.SOUTH, l2, -h * 5 / 100,
//                        SpringLayout.SOUTH, panel);
//
//   panel.setLayout(layout);
//   panel.revalidate();
// }
}}
-&jnlp;
-&jar;
-&zip;

**解説 [#he0e3381]
上記のサンプルでは、SpringLayoutを使って2つのラベルをパネル内にレイアウトしています。
* 解説 [#explanation]
上記のサンプルでは、`SpringLayout`を使って`2`つの`JComponent`をパネル内にレイアウトしています。

パネルのサイズが変更されるたびに、各ラベルのサイズとパネルからの距離が一定の割合になるように設定し直しています(ただしパネルの余白は無視)。
%%パネルのサイズが変更されるたびに、各ラベルのサイズとパネルからの距離が一定の割合になるように設定し直しています(ただしパネルの余白は無視)。%%

-JLabel1
--幅はパネルの90%、高さは55%
--パネルと自身のWESTからの距離5%、パネルと自身のNORTHからの距離5%
-JLabel2
--幅はパネルの40%、高さは30%
--パネルと自身のWESTからの距離50%、パネルと自身のSOUTHからの距離-5%
- `JLabel`
-- 幅はパネルの`90%`、高さは`55%`になるよう設定
-- 左上座標は親パネルの左上から`x: 5%`、`y: 5%`の位置
-- %%パネルと自身の`WEST`からの距離`5%`、パネルと自身の`NORTH`からの距離`5%`%%
- `JButton`
-- 幅はパネルの`40%`、高さは`30%`になるよう設定
-- 左上座標は、親パネルの左上から`x: 50%`、`y: 65%`の位置
-- %%パネルと自身の`WEST`からの距離`50%`、パネルと自身の`SOUTH`からの距離`-5%`%%

SpringLayoutでは原点は左上で、右方向、下方向に正の値を取る為、例えばパネルの南辺からコンポーネントの南辺までの距離を指定する場合は、layout.putConstraintする際にマイナスの値を指定する必要があります。
* 参考リンク [#reference]
- [https://docs.oracle.com/javase/jp/8/docs/api/javax/swing/SpringLayout.html SpringLayout (Java Platform SE 8)]

距離を0にすることも可能で、例えばサンプルコードのコメントアウトされたような指定をすると、ラベル1、2を左揃えで並べることができます。
* コメント [#comment]
#comment
- 以前の内容は、[[BoxLayoutでリスト状に並べる>Swing/ComponentList]]に移動しました。 -- &user(aterai); &new{2006-06-15 (木) 19:40:17};
- リスナーを使わなくても次ので出来ました。 --  &new{2010-09-02 (木) 02:41:13};

//**参考リンク
**コメント [#v98c3ed9]
- 以前の内容は[[Swing/ComponentList]]に移動しました。 -- [[terai]] &new{2006-06-15 (木) 19:40:17};
#code{{
panel.setLayout(layout);
Spring panelw = layout.getConstraint(SpringLayout.WIDTH, panel);
layout.getConstraints(name).setWidth(Spring.scale(panelw, .9f));
layout.getConstraints(name).setX(Spring.scale(panelw, .05f));
}}

- ご指摘ありがとうございます。こんなメソッドが有ったのですね。サンプルを全体的に修正してみました。 -- &user(aterai); &new{2010-09-02 (木) 07:01:18};

#comment