Swing/BoxLayoutAlignment の変更点
- 追加された行はこの色です。
- 削除された行はこの色です。
- Swing/BoxLayoutAlignment へ行く。
- Swing/BoxLayoutAlignment の差分を削除
--- category: swing folder: BoxLayoutAlignment title: BoxLayoutでJLabelの中央揃えをテストする tags: [BoxLayout, JLabel] author: aterai pubdate: 2015-01-26T00:15:23+09:00 description: BoxLayoutを設定したJPanelに、最小サイズを設定したJLabelを中央揃えで配置するテストを行います。 image: https://lh3.googleusercontent.com/-OKh2kmuDUus/VMUE-LLN_NI/AAAAAAAANvk/FtPEqk8f820/s800/BoxLayoutAlignment.png --- * 概要 [#summary] `BoxLayout`を設定した`JPanel`に、最小サイズを設定した`JLabel`を中央揃えで配置するテストを行います。 #download(https://lh3.googleusercontent.com/-OKh2kmuDUus/VMUE-LLN_NI/AAAAAAAANvk/FtPEqk8f820/s800/BoxLayoutAlignment.png) * サンプルコード [#sourcecode] #code(link){{ 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()); }} * 解説 [#explanation] 上記のサンプルは、[https://stackoverflow.com/questions/27790417/alignment-of-single-characters-in-java-boxlayout-on-y-axis-is-off-center 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_AXIS`の`Box`に、この`JLabel`が左右中央に配置されるよう`Box.createHorizontalGlue()`で挟んで追加 - `BoxLayout.Y_AXIS`の`Box`に、この`JLabel`が上下中央に配置されるよう`Box.createVerticalGlue()`で挟んで追加 - `JLabel#getMinimumSize()`の返す値を`JSpinner`で変更すると値が奇数になる場合で揃えがずれてしまう ---- - [https://bugs.openjdk.java.net/browse/JDK-8068374 JDK-8068374 setAlignmentX, setAlignmentY, getAlignmentX, getAlignmentY javadoc of JComponent - Java Bug System] - [https://bugs.openjdk.org/browse/JDK-8068374 JDK-8068374 setAlignmentX, setAlignmentY, getAlignmentX, getAlignmentY javadoc of JComponent - Java Bug System] -- via: [http://openjdk.5641.n7.nabble.com/lt-Swing-Dev-gt-8u-Typos-in-JComponent-setAlignment-methods-td295805.html OpenJDK Swing Development - <Swing Dev> 8u Typos in JComponent#setAlignment methods] -- https://docs.oracle.com/javase/jp/8/docs/api/javax/swing/JComponent.html#setAlignmentY-float- -- 「水平の配置方法を設定します。」はドキュメントの間違いで、実際の動作は「垂直の配置方法を設定します。」 -- `setAlignmentX`、`getAlignmentX`、`getAlignmentY`も同様に逆の説明になっている -- `java 9`のドキュメントは修正済み * 参考リンク [#reference] - [https://docs.oracle.com/javase/tutorial/uiswing/layout/box.html How to Use BoxLayout (The Java™ Tutorials > Creating a GUI With JFC/Swing > Laying Out Components Within a Container)] - [https://stackoverflow.com/questions/27790417/alignment-of-single-characters-in-java-boxlayout-on-y-axis-is-off-center swing - Alignment of Single Characters in Java BoxLayout on Y-Axis Is Off-Center - Stack Overflow] * コメント [#comment] #comment #comment