Boxlayout不会对齐

时间:2017-01-05 20:18:18

标签: java swing layout-manager border-layout boxlayout

好的,所以我想制作一个盒子布局来测试它,并在layout help page它指定你可以给它一个对齐,这是我尝试但它似乎根本不起作用。< / p>

package gameflow;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Toolkit;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class LoginScreen extends JFrame 
{
    private static final Dimension SCREENSIZE = Toolkit.getDefaultToolkit().getScreenSize();
    private static final double DEFAULTHEIGHT = (SCREENSIZE.getHeight() * 80) / 100;
    private static final double DEFAULTWIDTH = (SCREENSIZE.getWidth() * 80) / 100;
    private static final long serialVersionUID = -7245840869407664992L;
    private JTextField userfield = new JTextField(), passfield = new JTextField();
    private JLabel userlabel = new JLabel("Username"), passlabel = new JLabel("Password");
    private static final Dimension fieldSize = new Dimension();

    public LoginScreen()
    {
        super("Wraith: the game");
        setBounds((SCREENSIZE.width * 10) / 100, (SCREENSIZE.height * 10) / 100,(int)DEFAULTWIDTH,(int)DEFAULTHEIGHT);
        fieldSize.setSize((double)this.getWidth()/2,(double)this.getHeight()/30);

        userfield.setMaximumSize(fieldSize);
        userfield.setForeground(new Color(1f,1f,1f));

        passfield.setMaximumSize(fieldSize);
        passfield.setForeground(new Color(1f,1f,1f));

        userlabel.setMaximumSize(fieldSize);
        passlabel.setMaximumSize(fieldSize);

        JPanel panel = new JPanel();
        panel.setLayout(new BoxLayout(panel, BoxLayout.PAGE_AXIS));
        panel.setBackground(new Color(0f,0f,0f));
        panel.setAlignmentX(0.5f);

        panel.add(userlabel);
        panel.add(userfield);
        panel.add(passlabel);
        panel.add(passfield);
        this.add(panel, BorderLayout.CENTER);
    }
}

如你所见,Panel在JFrame中有一个boxlayout,它有一个BorderLayout,组件不会对齐到center。为什么呢?

1 个答案:

答案 0 :(得分:1)

首先,当您创建文本字段时,您应该使用:

JTextField textField = new JTextField(10);

该数字将允许组件确定显示大约10个字符的首选大小。但是,组件的实际大小可能由布局管理器确定。

  

组件不会与中心对齐。为什么呢?

因为这是BoxLayout的规则。将面板添加到BorderLayout的{​​{1}}后,面板会调整大小以填充框架的整个区域。因此,要知道JFrame将调整组件大小以根据其规则填充可用空间。

首先,每个组件都以其首选高度显示,并且额外的空间仅添加到面板的底部。因此,所有组件都显示在框架的顶部。

如果您希望组件在面板中垂直居中,则需要在面板的顶部和底部添加“胶水”。然后将在组件的上方/下方添加空白区域,使它们显示为居中。重新阅读教程链接,了解有关“粘合剂”如何工作的更多信息。

接下来,组件水平调整大小以填充面板的宽度。组件仅填充到其最大宽度。对于许多组件(标签,按钮...),最大宽度是首选宽度,但某些组件(文本组件)没有最大宽度。

因此,要使组件水平居中,您需要使用以下方法设置每个组件的对齐方式:

BoxLayout

对于文本字段,您可以使用以下命令阻止文本字段增长:

theComponent.setAlignment(0.5f);

尝试使用这些属性来查看不同的效果。

说了这么多,将一个面板(垂直和水平)置于框架中心的最简单方法是在框架的内容窗格上使用GridBagLayout。那么代码就是:

textField.setMaximumSize( textField.getPreferredSize() );

现在面板在框架中居中于其首选尺寸。