---
category: swing
folder: RadioButtonsLabelAlignment
title: JRadioButtonの選択アイコンを除いたテキスト先頭をJLabelと揃える
tags: [JRadioButton, JLabel, GridBagLayout]
author: aterai
pubdate: 2023-12-11T00:16:30+09:00
description: JRadioButtonやJCheckBoxの選択アイコンを除いたテキスト先頭が垂直配置したJLabelのテキスト先頭と揃うよう配置します。
image: https://drive.google.com/uc?id=1RKs4YswczAS_MAwgDe8zfp2Cwr_et1cS
---
* 概要 [#summary]
`JRadioButton`や`JCheckBox`の選択アイコンを除いたテキスト先頭が垂直配置した`JLabel`のテキスト先頭と揃うよう配置します。

#download(https://drive.google.com/uc?id=1RKs4YswczAS_MAwgDe8zfp2Cwr_et1cS)

* サンプルコード [#sourcecode]
#code(link){{
JPanel p = new JPanel(new GridBagLayout());
p.setBorder(BorderFactory.createEmptyBorder(8, 8, 8, 8));
p.setFocusTraversalPolicy(new ContainerOrderFocusTraversalPolicy());
p.setFocusTraversalPolicyProvider(true);
p.setFocusable(false);
// p.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
boolean leftToRightParent = p.getComponentOrientation().isLeftToRight();
GridBagConstraints gbc = new GridBagConstraints();
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.gridx = 1;
gbc.insets.top = 5;
ButtonGroup group = new ButtonGroup();
List<JComponent> list = Arrays.asList(
    new JRadioButton("JRadioButton1"),
    new JRadioButton("JRadioButton2"),
    new JRadioButton("JRadioButton3"),
    new JLabel("JLabel1"),
    new JLabel("JLabel2"),
    new JCheckBox("JCheckBox1"),
    new JCheckBox("JCheckBox2"));
int gap = 0;
for (JComponent c : list) {
  // c.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
  gbc.insets.left = 0;
  gbc.insets.right = 0;
  if (c instanceof JRadioButton) {
    JRadioButton button = (JRadioButton) c;
    if (gap == 0) {
      gap = getIconSpace(button);
      button.setSelected(true);
    }
    group.add(button);
  } else if (c instanceof JLabel) {
    boolean leftToRight = c.getComponentOrientation().isLeftToRight();
    if (leftToRight && leftToRightParent) {
      gbc.insets.left = gap;
    } else if (leftToRight) {
      gbc.insets.right = gap;
    } else if (leftToRightParent) {
      gbc.insets.right = gap;
    } else {
      gbc.insets.left = gap;
    }
  }
  p.add(c, gbc);
}
gbc.gridx = 2;
gbc.weightx = 1.0;
gbc.insets.left = 5;
gbc.insets.right = 5;
list.forEach(c -> p.add(new JTextField(), gbc));
}}

* 解説 [#explanation]
- `GridBagLayout`を使用して`JRadioButton`、`JLabel`、`JCheckBox`を垂直配置
-- `JFileChooser`の色選択パネル(`javax.swing.colorchooser.ColorPanel`)も同様に`GridBagLayout`を使用して赤・緑・青用の`JRadioButton`とアルファ用の`JLabel`を垂直配置している
- `UIManager.getIcon("RadioButton.icon")`で`JRadioButton`の選択アイコンを取得し、その幅と`JRadioButton`の左余白、テキストと選択アイコンとの距離を記憶
- 選択アイコンの存在しない`JLabel`を親`JPanel`に追加する場合の制約`GridBagConstraints#insets#left`に上記の値を代入してグリッドセルの左余白を設定し、各テキスト先頭が垂直に揃うよう配置
-- `JFileChooser`の色選択パネルでは`GridBagConstraints#insets#left`ではなく`EmptyBorder`を使用して左余白を設定している
-- `JColorChooser`の色選択パネルでは`GridBagConstraints#insets#left`ではなく`EmptyBorder`を使用して左余白を設定している
-- `ComponentOrientation`で`GridBagLayout`のレイアウトや`GridBagConstraints#insets`の左右が入れ替わることを回避するためか?

* 参考リンク [#reference]
- [[JLabelの最大幅を共有して異なるパネル間で垂直位置を揃える>Swing/AlignedLabel]]

* コメント [#comment]
#comment
#comment

- 2023-12-11
#swingdescription(Swing/RadioButtonsLabelAlignment,JRadioButtonの選択アイコンを除いたテキスト先頭をJLabelと揃える,JRadioButtonやJCheckBoxの選択アイコンを除いたテキスト先頭が垂直配置したJLabelのテキスト先頭と揃うよう配置します。,https://drive.google.com/thumbnail?id=1RKs4YswczAS_MAwgDe8zfp2Cwr_et1cS)

** JRadioButtonの選択アイコンを除いたテキスト先頭をJLabelと揃える [#RadioButtonsLabelAlignment]
#swingdescription(Swing/RadioButtonsLabelAlignment,JRadioButtonの選択アイコンを除いたテキスト先頭をJLabelと揃える,JRadioButtonやJCheckBoxの選択アイコンを除いたテキスト先頭が垂直配置したJLabelのテキスト先頭と揃うよう配置します。,https://drive.google.com/thumbnail?id=1RKs4YswczAS_MAwgDe8zfp2Cwr_et1cS)