BoxLayout忽略setYAlignment方法

4
这里是一个函数:

/**
 * 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部分吗? 这是它的渲染方式

阅读 Swing 教程中的 使用 Box 布局,并查看 修复对齐问题 以获取有关对齐方式的详细说明。如果您仍需要帮助,请发布一个演示问题的 SSCCE - camickr
我会查阅相关资料,能否请您解释一下 SSCCE 这个缩写是什么意思? - Shaun Wild
4
谷歌,谷歌,必应,必应 :-) - kleopatra
除非您展示一个SSCCE,否则赏金无法帮助您。 - kleopatra
我不知道你在说什么。 - Shaun Wild
这个问题让我很烦恼,真是一群不太友好的人碰巧看到了我的问题。不过我已经找到答案了。 - Shaun Wild
2个回答

5
作为替代方案,考虑使用嵌套布局。在下面的示例中,相关标签添加到BorderLayoutSOUTH区域(JFrame的默认设置),并向CENTER添加登录面板的占位符。检查每种方法的调整大小行为是否合适。
附加说明:我希望[了解]为什么setAlignmentY()被忽略了。如何使用BoxLayout:BoxLayout特性中所述,“当BoxLayout从上到下布置组件时,...任何额外的空间都出现在容器的底部。”这解释了您最初的观察和正确的解决方案
在API中,注意 setAlignmentX() "设置垂直对齐方式",以及setAlignmentY() "设置水平对齐方式"。在此上下文中,垂直表示从上到下布局的垂直轴,例如BoxLayout.Y_AXIS,而水平表示从左到右布局的水平轴,例如BoxLayout.X_AXIS。在如何使用BoxLayout:解决对齐问题中,BoxAlignmentDemo对比了这两者。在从左到右的布局(如下图所示)中,setAlignmentY()用于相对于水平布局轴调整垂直位置。在类似你的从上到下的布局中,setAlignmentY()则没有任何效果。

setAlignmentY


image

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://dev59.com/YHbZa4cB1Zd3GeqPJLkZ#18805146 */
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();
            }
        });
    }
}

3

使用

    add(Box.createVerticalGlue());

为了创建一个垂直间距,将组件推到JFrame的底部。

对于 createVerticalGlue(),请点赞;请考虑添加一个 sscce 来展示您的方法,例如这里所示的一个。 - trashgod

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接