好的,所以我想制作一个盒子布局来测试它,并在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。为什么呢?
答案 0 :(得分:1)
首先,当您创建文本字段时,您应该使用:
JTextField textField = new JTextField(10);
该数字将允许组件确定显示大约10个字符的首选大小。但是,组件的实际大小可能由布局管理器确定。
组件不会与中心对齐。为什么呢?
因为这是BoxLayout
的规则。将面板添加到BorderLayout
的{{1}}后,面板会调整大小以填充框架的整个区域。因此,要知道JFrame
将调整组件大小以根据其规则填充可用空间。
首先,每个组件都以其首选高度显示,并且额外的空间仅添加到面板的底部。因此,所有组件都显示在框架的顶部。
如果您希望组件在面板中垂直居中,则需要在面板的顶部和底部添加“胶水”。然后将在组件的上方/下方添加空白区域,使它们显示为居中。重新阅读教程链接,了解有关“粘合剂”如何工作的更多信息。
接下来,组件水平调整大小以填充面板的宽度。组件仅填充到其最大宽度。对于许多组件(标签,按钮...),最大宽度是首选宽度,但某些组件(文本组件)没有最大宽度。
因此,要使组件水平居中,您需要使用以下方法设置每个组件的对齐方式:
BoxLayout
对于文本字段,您可以使用以下命令阻止文本字段增长:
theComponent.setAlignment(0.5f);
尝试使用这些属性来查看不同的效果。
说了这么多,将一个面板(垂直和水平)置于框架中心的最简单方法是在框架的内容窗格上使用GridBagLayout。那么代码就是:
textField.setMaximumSize( textField.getPreferredSize() );
现在面板在框架中居中于其首选尺寸。