BoxLayout忽略setYAlighment

这是一个function:

/** * Creates an instance of a JLabel with the given arguments * @param text The text to be displayed on the Label * @param font The font of the label * @param bold set to true if you want the label's text to be bold * @param fontSize The size of the font to be rendered * @param alignment An alignment (Eg CENTER_ALIGNMENT) * @param verticleAlignment an optional argument to allow one to choose the Y alignment * **/ public JLabel createLabel(String text, String font, boolean bold, int fontSize, float alignment, float...verticleAlignment){ JLabel label = new JLabel(text); label.setFont(new Font(font, bold ? Font.BOLD : Font.PLAIN, fontSize)); label.setAlignmentX(alignment); if(verticleAlignment.length > 0){ label.setAlignmentY(verticleAlignment[0]); } return label; } 

出于某种原因,无论我在varArg verticleAlignment中输入什么,它实际上都不适用?

 add(createLabel("ChatBytes™ - Do not steal.", "Arial", false, 12, CENTER_ALIGNMENT, BOTTOM_ALIGNMENT)); 

任何人都可以看到为什么它会忽略我的函数的setYAlignment部分?

这是它呈现的方式

作为替代方案,请考虑嵌套布局 。 在下面的示例中,相关标签将添加到BorderLayoutSOUTH区域, JFrame的默认值,并且登录面板的占位符将添加到CENTER 。 检查每种方法的resize行为是否合适。

附录: 我希望[学习]为什么 忽略 setAlignmentY()

如在如何使用BoxLayout:Box布局function中所述 ,“当BoxLayout从上到下布置组件时,……容器底部会出现任何额外空间。” 这解释了您的原始观察和正确的解决方案

在API中,请注意setAlignmentX() “设置垂直对齐”和setAlignmentY() “设置水平对齐”。 在此上下文中, vertical表示从上到下布局的垂直轴,例如BoxLayout.Y_AXIS ,而horizo​​ntal表示从左到右布局的水平轴,例如BoxLayout.X_AXIS 。 在如何使用BoxLayout:修复对齐问题BoxAlignmentDemo对比这两者。 在从左到右的布局中,如下图所示, setAlignmentY()用于调整相对于水平布局轴的垂直定位。 在从上到下的布局中,例如你的布局, setAlignmentY()根本没有效果。

setAlignmentY


图片

 import java.awt.BorderLayout; import java.awt.EventQueue; import java.awt.Font; import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.border.EmptyBorder; /** @see https://stackoverflow.com/a/18805146/230513 */ public class Test { private void display() { JFrame f = new JFrame("Test"); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.add(createLogin(), BorderLayout.CENTER); JLabel admonition = new JLabel("ChatBytes™—Do not steal.", JLabel.CENTER); f.add(admonition, BorderLayout.SOUTH); f.pack(); f.setLocationRelativeTo(null); f.setVisible(true); } private static JPanel createLogin() { JPanel p = new JPanel(); p.setLayout(new BoxLayout(p, BoxLayout.Y_AXIS)); JLabel label = new JLabel("Existing CHATBYTES login panel."); label.setFont(label.getFont().deriveFont(Font.ITALIC, 24f)); label.setAlignmentX(0.5f); label.setBorder(new EmptyBorder(0, 20, 0, 20)); p.add(Box.createVerticalStrut(36)); p.add(label); p.add(Box.createVerticalStrut(144)); return p; } public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { new Test().display(); } }); } } 

使用

  add(Box.createVerticalGlue()); 

创建一个垂直空间,将组件推送到JFrame的底部