Swing/AlignedLabel のバックアップ(No.1)
- バックアップ一覧
 - 差分 を表示
 - 現在との差分 を表示
 - 現在との差分 - Visual を表示
 - ソース を表示
 - Swing/AlignedLabel へ行く。
  
- 1 (2018-05-31 (木) 20:38:47)
 - 2 (2018-10-19 (金) 16:50:46)
 - 3 (2020-10-13 (火) 18:28:56)
 - 4 (2022-07-10 (日) 04:45:54)
 - 5 (2025-01-03 (金) 08:57:02)
 - 6 (2025-01-03 (金) 09:01:23)
 - 7 (2025-01-03 (金) 09:02:38)
 - 8 (2025-01-03 (金) 09:03:21)
 - 9 (2025-01-03 (金) 09:04:02)
 - 10 (2025-06-19 (木) 12:41:37)
 - 11 (2025-06-19 (木) 12:43:47)
 
 
- category: swing folder: AlignedLabel title: JLabelの最大幅を共有して異なるパネル間で垂直位置を揃える tags: [JLabel, JPanel, BoxLayout] author: aterai pubdate: 2018-02-19T16:26:52+09:00 description: JLabelの垂直位置を異なるパネル間でも揃えるため、最大幅のJLabelを検索してこれをすべての推奨サイズとして使用します。 image: https://drive.google.com/uc?id=1OYxUdKX7mxvEzkX5pjBjy2IFjYRLtfmKMw
 
概要
JLabelの垂直位置を異なるパネル間でも揃えるため、最大幅のJLabelを検索してこれをすべての推奨サイズとして使用します。
Screenshot

Advertisement
サンプルコード
// @see javax/swing/plaf/metal/MetalFileChooserUI.java
class AlignedLabel extends JLabel {
  private static final int INDENT = 10;
  // private AlignedLabel[] group;
  protected List<AlignedLabel> group;
  protected int maxWidth;
  protected AlignedLabel(String text) {
    super(text);
    // setAlignmentX(JComponent.LEFT_ALIGNMENT);
    setHorizontalAlignment(SwingConstants.RIGHT);
  }
  @Override public Dimension getPreferredSize() {
    Dimension d = super.getPreferredSize();
    // Align the width with all other labels in group.
    return new Dimension(getMaxWidth() + INDENT, d.height);
  }
  private int getMaxWidth() {
    if (maxWidth == 0 && group != null) {
      int max = group.stream()
        .map(AlignedLabel::getSuperPreferredWidth)
        .reduce(0, Integer::max);
      group.forEach(al -> al.maxWidth = max);
    }
    return maxWidth;
  }
  private int getSuperPreferredWidth() {
    return super.getPreferredSize().width;
  }
  public static void groupLabels(List<AlignedLabel> group) {
    for (AlignedLabel al: group) {
      al.group = group;
    }
  }
}
View in GitHub: Java, Kotlin解説
上記のサンプルでは、javax/swing/plaf/metal/MetalFileChooserUI.javaのAlignedLabelを参考に、異なるパネル間でJLabelの垂直位置揃えを行っています。
AlignedLabelJLabelを継承JLabel#getPreferredSize()を垂直位置揃えを適用するラベルの中での最大幅を検索取得して返すようオーバーライド
BoxLayoutAlignedLabelとその右に配置するコンポーネントをBox.createHorizontalBox()で作成したBoxに追加FileChooserとHTTP ProxyのタイトルをTitledBorderで設定したBoxを2個作成し、上記のAlignedLabelを配置したBoxをそれぞれ追加- 複数の
BoxにAlignedLabelが配置されていても、各AlignedLabelの推奨サイズの幅はすべて同じになっているため垂直位置は揃う 
参考リンク
- GroupLayoutの使用
 - GridBagLayoutの使用
1つのパネルで垂直位置揃えを行う場合は、GroupLayoutやGridBagLayoutを使用することが可能