Swing/ButtonWidth のバックアップ(No.14)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/ButtonWidth へ行く。
- 1 (2005-02-03 (木) 02:03:51)
- 2 (2005-04-28 (木) 04:33:03)
- 3 (2005-07-12 (火) 21:45:16)
- 4 (2005-10-09 (日) 18:20:38)
- 5 (2006-02-27 (月) 15:30:14)
- 6 (2006-04-12 (水) 19:35:15)
- 7 (2006-06-15 (木) 17:51:37)
- 8 (2007-07-13 (金) 20:44:02)
- 9 (2007-08-02 (木) 11:15:06)
- 10 (2008-03-21 (金) 19:27:54)
- 11 (2010-12-13 (月) 00:08:51)
- 12 (2011-09-21 (水) 21:54:52)
- 13 (2011-10-02 (日) 17:18:12)
- 14 (2012-04-03 (火) 20:38:57)
- 15 (2012-05-11 (金) 16:43:59)
- 16 (2012-07-19 (木) 21:27:13)
- 17 (2013-04-14 (日) 00:33:29)
- 18 (2013-05-26 (日) 05:26:34)
- 19 (2013-06-12 (水) 15:35:30)
- 20 (2013-10-22 (火) 17:32:41)
- 21 (2014-10-30 (木) 00:06:20)
- 22 (2014-11-27 (木) 17:54:45)
- 23 (2015-06-04 (木) 18:11:16)
- 24 (2015-11-09 (月) 20:55:12)
- 25 (2016-08-08 (月) 14:10:11)
- 26 (2016-09-01 (木) 21:31:57)
- 27 (2017-03-28 (火) 19:26:24)
- 28 (2017-04-04 (火) 14:00:27)
- 29 (2018-02-24 (土) 19:51:30)
- 30 (2018-03-16 (金) 18:24:18)
- 31 (2020-03-18 (水) 22:12:24)
- 32 (2021-09-15 (水) 10:31:09)
TITLE:JButtonなどの高さを変更せずに幅を指定
JButtonなどの高さを変更せずに幅を指定
高さはデフォルトのまま幅だけを指定して、JButton、JComboBox、JTextFieldなどのサイズを変更します。
- &jnlp;
- &jar;
- &zip;
サンプルコード
Dimension dim = button1.getPreferredSize();
button1.setPreferredSize(new Dimension(100, dim.height));
button2.setPreferredSize(new Dimension(100, dim.height));
Box box1 = Box.createHorizontalBox();
box1.add(Box.createHorizontalGlue());
box1.add(button1);
box1.add(Box.createHorizontalStrut(5));
box1.add(button2);
box1.add(Box.createHorizontalStrut(5));
box1.add(Box.createRigidArea(new Dimension(0, dim.height+10)));
解説
サンプルの下段のようにJButtonの幅を一定にそろえて水平に並べたい場合や、GridBugLayoutでウエイトを指定するのが面倒といった場合に使用します。
上記のサンプルでは、まずJButtonのUIがフォントサイズや文字列の長さから決めたデフォルトサイズをgetPreferredSize()で取得しています。高さはそのまま利用し、幅だけ一定の値を設定して、新たなデフォルトサイズを作成し、setPreferredSize()しています。これで次からgetPreferredSize()で帰ってくる値は、どちらのボタンでも全く同じになります。
このgetPreferredSize()で得られる値を使用するかどうかは、レイアウトマネージャーによって異なりますが、水平方向にコンポーネントを並べるBoxLayoutの場合は以下のようになるため、パネルをリサイズしても、ボタンのサイズはどちらも同じで変化しません。
- 幅: 推奨サイズ(getPreferredSizeメソッド)から取得した値
- 高さ: 各コンポーネントの推奨サイズ(getPreferredSizeメソッド)で得られた中からもっとも大きな値
- 上記のサンプルでbutton1.setPreferredSize(new Dimension(100, 0));としても結果は同じ
例えばフレームをpack()する前にgetPreferredSize()ではなく、getSize()でサイズを取得すると、[width=0,height=0]が帰ってきます。コンポーネントが表示されている場合、getSize()で得られるサイズは、その実際に表示されているサイズになります。
以下はJLabelをgetPreferredSize()した場合の例です。初期状態(preferredSizeがnull)の場合は、JLabelのUIがサイズを計算しています。
JLabel l = new JLabel();
l.setText("a"); //preferredSizeがnullの場合、UIがサイズを計算
//l.getPreferredSize() -> Dimension[width=6,height=13]
l.setText("aaaa"); //JLabelの場合、Fontサイズと文字列の長さなどで決まる
//l.getPreferredSize() -> Dimension[width=24,height=13]
l.setText("<html>aa<br>aa");
//l.getPreferredSize() -> Dimension[width=12,height=26]
l.setPreferredSize(new Dimension(10,10)); //preferredSizeを設定した場合
//l.getPreferredSize() -> Dimension[width=10,height=10]
l.setPreferredSize(null); //preferredSizeをnullに戻した場合
//l.getPreferredSize() -> Dimension[width=12,height=26]
JComboBox、JTextField などのコンポーネントでは、JComboBoxなどの幅をカラム数で指定のように、カラム数で幅を指定することもできます。JDK 1.5 でこの方法をしようすると、コンポーネントによって高さや余白などが微妙に異なりますが、JDK 1.6 以上ならうまくサイズを指定することができます。
LayoutManagerを使ってJButtonの幅を固定したい場合は、例えばSpringLayoutを以下のように使用する方法などがあります。
private static JComponent createRightAlignButtonBox2(
List<JButton>list, int buttonWidth, int buttonHeight, int gap) {
SpringLayout layout = new SpringLayout();
JPanel p = new JPanel(layout);
SpringLayout.Constraints pCons = layout.getConstraints(p);
pCons.setConstraint(SpringLayout.SOUTH, Spring.constant(buttonHeight+gap+gap));
Spring x = layout.getConstraint(SpringLayout.WIDTH, p);
Spring y = Spring.constant(gap);
Spring g = Spring.minus(Spring.constant(gap));
Spring width = Spring.constant(buttonWidth);
for(JButton b: list) {
SpringLayout.Constraints constraints = layout.getConstraints(b);
constraints.setConstraint(SpringLayout.EAST, x = Spring.sum(x, g));
constraints.setY(y);
constraints.setWidth(width);
p.add(b);
x = Spring.sum(x, Spring.minus(width));
}
return p;
}