BoxLayout ignores setYAlighment

随声附和 提交于 2019-11-27 07:59:12

问题


Here is a 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 (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;
}

For some reason, no matter what I enter in the varArg verticleAlignment, it doesn't actually apply?

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

Can anyone see a reason why it would ignore the setYAlignment part of my function?


回答1:


As an alternative, consider a nested layout. In the example below, the relevant label is added to the SOUTH area of a BorderLayout, the default for JFrame, and a placeholder for your login panel is added to CENTER. Examine the resize behavior of each approach for suitability.

Addendum: I hope to [learn] why the setAlignmentY() is being ignored.

As noted in How to Use BoxLayout: Box Layout Features, "When a BoxLayout lays out components from top to bottom, … any extra space appears at the bottom of the container." This explains your original observation and correct solution.

In the API, note that setAlignmentX() "Sets the the vertical alignment," and setAlignmentY() "Sets the the horizontal alignment." In this context, vertical means the vertical axis of a top-to-bottom layout, such as BoxLayout.Y_AXIS, while horizontal means the horizontal axis of a left-to-right layout, such as BoxLayout.X_AXIS. In How to Use BoxLayout: Fixing Alignment Problems, BoxAlignmentDemo contrasts the two. In a left-to-right layout, pictured below, setAlignmentY() is used to adjust vertical positioning relative to the horizontal layout axis. In a top-to-bottom layout, such as yours, setAlignmentY() simply has no effect.


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();
            }
        });
    }
}



回答2:


use

    add(Box.createVerticalGlue());

to create a vertical space that pushes the component to the bottom of the JFrame



来源:https://stackoverflow.com/questions/18744960/boxlayout-ignores-setyalighment

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!