Swing/AlignedLabel のバックアップ(No.2)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - 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)
- 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
の垂直位置揃えを行っています。
AlignedLabel
JLabel
を継承JLabel#getPreferredSize()
を垂直位置揃えを適用するラベルの中での最大幅を検索取得して返すようオーバーライド
BoxLayout
AlignedLabel
とその右に配置するコンポーネントをBox.createHorizontalBox()
で作成したBox
に追加FileChooser
とHTTP Proxy
のタイトルをTitledBorder
で設定したBox
を2
個作成し、上記のAlignedLabel
を配置したBox
をそれぞれ追加- 複数の
Box
にAlignedLabel
が配置されていても、各AlignedLabel
の推奨サイズの幅はすべて同じになっているため垂直位置は揃う
参考リンク
- GroupLayoutの使用
- GridBagLayoutの使用
1
つのパネル内で垂直位置揃えを行う場合は、GroupLayout
やGridBagLayout
を使用することが可能