【问题标题】:Boxlayout wont alignBoxlayout不会对齐
【发布时间】:2017-05-20 12:31:27
【问题描述】:

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

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 在具有 BorderLayout 的 JFrame 内有一个 boxlayout,组件不会对齐到中心。为什么?

【问题讨论】:

  • 就像现在一样,所有组件都将具有相同的左边缘。在面板上调用 setAlignment 不会影响单个组件。
  • 好吧,那我该怎么做呢?
  • 我会查看 SpringLayout 而不是 BoxLayout 的表单。甚至是miglayout。 docs.oracle.com/javase/tutorial/uiswing/layout/spring.html
  • 不错的尝试然而,SpringLayout 是非常低级的,因此您真的应该只将它与 GUI 构建器一起使用,而不是尝试手动编写 Spring 布局管理器。我>

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


【解决方案1】:

首先,当你创建一个你应该使用的文本字段时:

JTextField textField = new JTextField(10);

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

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

因为这是BoxLayout 的规则。当面板添加到JFrameBorderLayout 时,面板会调整大小以填充整个框架区域。所以知道BoxLayout 将根据其规则调整组件的大小以填充可用空间。

首先,每个组件都显示在其首选高度,额外的空间只是添加到面板的底部。所以所有组件都出现在框架的顶部。

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

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

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

theComponent.setAlignment(0.5f);

对于文本字段,您可以使用以下方法防止文本字段增长:

textField.setMaximumSize( textField.getPreferredSize() );

因此,尝试这些属性以查看不同的效果。

话虽如此,在框架上将面板(垂直和水平)居中的最简单方法是在框架的内容窗格上使用 GridBagLayout。那么代码就是:

setLayout( new GridBagLayout() );
add(panel, new GridBagConstraints());

现在面板以其首选大小在框架中居中。

【讨论】:

    猜你喜欢
    • 2014-04-30
    • 2012-11-06
    • 1970-01-01
    • 2012-06-18
    • 2012-07-28
    • 1970-01-01
    • 2021-11-20
    • 2014-09-17
    • 1970-01-01
    相关资源
    最近更新 更多