概要
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
が使用可能