Swing/ButtonWidth のバックアップ(No.18)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - 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)
- 33 (2025-01-03 (金) 08:57:02)
- 34 (2025-01-03 (金) 09:01:23)
- 35 (2025-01-03 (金) 09:02:38)
- 36 (2025-01-03 (金) 09:03:21)
- 37 (2025-01-03 (金) 09:04:02)
- 38 (2025-06-19 (木) 12:41:37)
- 39 (2025-06-19 (木) 12:43:47)
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)));
View in GitHub: Java, Kotlin解説
サンプルの下段のように`JButton
の幅を一定にそろえて水平に並べたい場合や、
GridBugLayout
`でウエイトを指定するのが面倒といった場合に使用します。
上記のサンプルでは、まず`JButton
の
UI
がフォントサイズや文字列の長さから決めたデフォルトサイズを
getPreferredSize()
で取得しています。高さはそのまま利用し、幅だけ一定の値を設定して、新たなデフォルトサイズを作成し、
setPreferredSize()
しています。これで次から
getPreferredSize()
`で帰ってくる値は、どちらのボタンでも全く同じになります。
この`getPreferredSize()
で得られる値を使用するかどうかは、レイアウトマネージャーによって異なりますが、水平方向にコンポーネントを並べる
BoxLayout
`の場合は以下のようになるため、パネルをリサイズしても、ボタンのサイズはどちらも同じで変化しません。
- 幅: 推奨サイズ(`
getPreferredSize
`メソッド)から取得した値 - 高さ: 各コンポーネントの推奨サイズ(`
getPreferredSize
`メソッド)で得られた中からもっとも大きな値- 上記のサンプルで`
button1.setPreferredSize(new Dimension(100, 0));
`としても結果は同じ
- 上記のサンプルで`
例えば各ボタンを格納した親フレームを`pack()
する前に
JButton#getPreferredSize()
ではなく、
JButton#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.0
でこの方法をしようすると、コンポーネントによって高さや余白などが微妙に異なりますが、
JDK 1.6.0
`以上ならうまくサイズを指定することができます。
`setPreferredSize()
などを使わず、
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;
}
参考リンク
- JComboBoxなどの幅をカラム数で指定
- SpringLayoutの使用
- Santhosh Kumar's Weblog
- 専用のレイアウトマネージャを作成するサンプルがあります。
コメント
- `
SpringLayout
`などを使って幅を固定する方法を追加(更新日時は忘れました)。スクリーンショットは未更新。 -- aterai