为什么GridBagConstraints不起作用?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么GridBagConstraints不起作用?相关的知识,希望对你有一定的参考价值。
我有JFrame表单,它必须在表单中心的某处包含TextField,我使用GridBagLayout在框架上设置TextField位置。
代码如下:
public static JFrame enterFrameDraw(JFrame frame){
JButton btnEnter = new JButton("Sign in!");
JLabel loginLabel = new JLabel("Login!");
GridBagLayout gbl = new GridBagLayout();
JTextField textFieldLogin = new JTextField();
textFieldLogin.setBackground(Color.GRAY);
btnEnter.addActionListener(e -> {
try{
Chat.btnEnterHandler(frame);
} catch (Exception e2){
e2.printStackTrace();
}
});
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.setTitle(FRM_TITLE);
frame.setLocation(FRM_LOC_X, FRM_LOC_Y);
frame.setSize(FRM_WIDTH, FRM_HEIGHT);
frame.setLayout(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
c.anchor = GridBagConstraints.NORTH;
c.fill = GridBagConstraints.NONE;
c.gridheight = 1;
c.gridwidth = GridBagConstraints.REMAINDER;
c.gridx = GridBagConstraints.RELATIVE;
c.gridy = GridBagConstraints.RELATIVE;
c.insets = new Insets(40, 0, 0, 0);
c.ipadx = 0;
c.ipady = 0;
c.weightx = 0.0;
c.weighty = 0.0;
gbl.setConstraints(textFieldLogin, c);
frame.add(textFieldLogin, c);
frame.setResizable(false);
frame.setVisible(true);
return frame;
}
结果似乎是:Image
问题可能在于“frame.add()”而不是简单的“add()”吗?
更新:
修改后的方法enterFrameDraw()。仍然无法正常工作。
public static JFrame enterFrameDraw(JFrame frame){
JButton btnEnter = new JButton("Sign in!");
JLabel loginLabel = new JLabel("Login!");
GridBagLayout gbl = new GridBagLayout();
JTextField textFieldLogin = new JTextField();
textFieldLogin.setBackground(Color.GRAY);
btnEnter.addActionListener(e -> {
try{
Chat.btnEnterHandler(frame);
} catch (Exception e2){
e2.printStackTrace();
}
});
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.setTitle(FRM_TITLE);
frame.setLocation(FRM_LOC_X, FRM_LOC_Y);
frame.setSize(FRM_WIDTH, FRM_HEIGHT);
frame.setLayout(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
c.anchor = GridBagConstraints.NORTH;
c.fill = GridBagConstraints.HORIZONTAL;
c.gridheight = 1;
c.gridwidth = GridBagConstraints.REMAINDER;
c.gridx = GridBagConstraints.RELATIVE;
c.gridy = GridBagConstraints.RELATIVE;
c.insets = new Insets(0, 40, 0, 40);
c.ipadx = 0;
c.ipady = 0;
c.weightx = 0.5;
c.weighty = 0.0;
gbl.setConstraints(textFieldLogin, c);
frame.add(textFieldLogin);
frame.setResizable(false);
frame.setVisible(true);
return frame;
}
更新2:我希望在表单上有什么。图片:This one
答案
据我所知,有两个问题。
- 您需要将约束'fill设置为水平:
c.fill = GridBagConstraints.HORIZONTAL;
- 您需要将约束'weightx设置为非零值:
c.weightx = 0.5;
编辑1:
您可以通过两种方式集中内容:
- 定义约束的插入以从左侧和右侧推入它,如下所示:
c.insets = new Insets(0, 40, 0, 40);
这里的值40只是一个例子。您可以将参数更改为任何适合的参数。
- 您可以使用javax.swing.Box创建空网格单元格。要将内容保持在中心位置,您可以在中间组件的任一侧创建一个空的“支柱”:
c.gridx = 0; c.gridy = 0; c.weightx = 0.5; frame.add(Box.createHorizontalStrut(100), c); c.gridx = 1; frame.add(textFieldLogin, c); c.gridx = 2; frame.add(Box.createHorizontalStrut(100), c);
同样,这里的值100只是一个示例,您应该根据需要调整参数。
在gridbaglayout的上下文中阅读像Struts和Glues这样的东西是值得的,它们对于按照你想要的方式组织你的内容非常有用。
编辑2:
要在中心的文本字段下添加更多组件,您应该使用第二种方法将水平支柱添加到第一行中的单元格。
我们的想法是,如果在该单元格中存在组件,则在单元格中放置支柱会填充组件将使用的空间。因此,通过在第一行中指定水平支柱的宽度,具有与支柱相同x值的任何后续组件将与支柱共享相同的宽度。
所以在这种情况下,您的方法可能如下所示:
public static JFrame enterFrameDraw(JFrame frame){
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.setResizable(false);
frame.setSize(500, 500);
frame.setLayout(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
c.fill = GridBagConstraints.HORIZONTAL;
c.gridx = 0;
c.gridy = 0;
c.weightx = 1;
frame.add(Box.createHorizontalStrut(80), c);
JTextField textFieldLogin = new JTextField();
textFieldLogin.setBackground(Color.GRAY);
c.gridx = 1;
c.gridy = 0;
frame.add(textFieldLogin, c);
c.gridx = 2;
c.gridy = 0;
frame.add(Box.createHorizontalStrut(80), c);
JLabel label = new JLabel("Label");
c.gridx = 0;
c.gridy = 1;
frame.add(label, c);
frame.setVisible(true);
return frame;
}
这里标签被添加到第二行,它不会出现在中心。
以上是关于为什么GridBagConstraints不起作用?的主要内容,如果未能解决你的问题,请参考以下文章