概要

BoxLayoutを設定したJPanelに、最小サイズを設定したJLabelを中央揃えで配置するテストを行います。

サンプルコード

JLabel l2 = new JLabel("abc") {
  @Override public Dimension getPreferredSize() {
    return new Dimension(50, 50);
  }

  @Override public Dimension getMinimumSize() {
    Dimension d = super.getMinimumSize();
    if (Objects.nonNull(d)) {
      int i = ((Integer) spinner.getValue()).intValue();
      d.setSize(i, i);
    }
    return d;
  }
};
l2.setOpaque(true);
l2.setBackground(Color.ORANGE);
l2.setFont(l.getFont().deriveFont(Font.PLAIN));
l2.setAlignmentX(Component.CENTER_ALIGNMENT);
l2.setAlignmentY(Component.CENTER_ALIGNMENT);
l2.setVerticalAlignment(SwingConstants.CENTER);
l2.setVerticalTextPosition(SwingConstants.CENTER);
l2.setHorizontalAlignment(SwingConstants.CENTER);
l2.setHorizontalTextPosition(SwingConstants.CENTER);

JPanel p2 = new TestPanel();
p2.setLayout(new BoxLayout(p2, BoxLayout.Y_AXIS));
p2.add(Box.createVerticalGlue());
p2.add(l2);
p2.add(Box.createVerticalGlue());
View in GitHub: Java, Kotlin

解説

上記のサンプルは、swing - Alignment of Single Characters in Java BoxLayout on Y-Axis Is Off-Center - Stack Overflowを参考にしてBoxLayoutの中央揃えのバグ?を検証するために作成しています。

  • setAlignmentX(Component.CENTER_ALIGNMENT)setAlignmentY(Component.CENTER_ALIGNMENT)を設定したJLabelを作成
  • BoxLayout.X_AXISBoxに、このJLabelが左右中央に配置されるようBox.createHorizontalGlue()で挟んで追加
  • BoxLayout.Y_AXISBoxに、このJLabelが上下中央に配置されるようBox.createVerticalGlue()で挟んで追加
  • JLabel#getMinimumSize()の返す値をJSpinnerで変更すると値が奇数になる場合で揃えがずれてしまう

参考リンク

コメント