下面是一个函数:
/**
* 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 (E.g. 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部分吗?

发布于 2013-09-14 16:19:56
使用
add(Box.createVerticalGlue());创建将组件推送到JFrame底部的垂直空间
发布于 2013-09-14 18:39:07
作为一种选择,可以考虑使用nested layout。在下面的示例中,相关标签被添加到BorderLayout的BorderLayout区域,JFrame的默认值,以及登录面板的占位符添加到CENTER中。检查每种方法的调整大小行为是否合适。
增编:我希望了解一下为什么setAlignmentY()被忽视了。
正如http://docs.oracle.com/javase/tutorial/uiswing/layout/box.html#features中所指出的,“当BoxLayout从上到下排列组件时,容器底部会出现任何额外的空间。”这解释了您的原始observation并更正了solution。
在API中,请注意setAlignmentX()“设置垂直对齐”,而setAlignmentY()“设置水平对齐”。在这种情况下,垂直表示自上而下布局(如BoxLayout.Y_AXIS )的垂直轴,而水平表示从左到右布局(如BoxLayout.X_AXIS )的水平轴。在http://docs.oracle.com/javase/tutorial/uiswing/layout/box.html#alignment中,BoxAlignmentDemo将两者进行对比。在从左到右的布局,如下图所示,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();
}
});
}
}https://stackoverflow.com/questions/18744960
复制相似问题