gpt4 book ai didi

java - 盒子布局无法对齐

转载 作者:行者123 更新时间:2023-12-01 09:03:22 24 4
gpt4 key购买 nike

好吧,所以我想制作一个盒子布局来测试它,并在 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 在 JFrame 内部有一个 boxlayout,而 JFrame 有一个 BorderLayout,组件不会居中对齐。为什么?

最佳答案

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

JTextField textField = new JTextField(10);

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

the components wont align to center. Why?

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

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

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

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

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

theComponent.setAlignment(0.5f);

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

textField.setMaximumSize( textField.getPreferredSize() );

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

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

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

现在面板以其首选尺寸位于框架中央。

关于java - 盒子布局无法对齐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41493937/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com