为什么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

答案

据我所知,有两个问题。

  1. 您需要将约束'fill设置为水平: c.fill = GridBagConstraints.HORIZONTAL;
  2. 您需要将约束'weightx设置为非零值: c.weightx = 0.5;

编辑1:

您可以通过两种方式集中内容:

  1. 定义约束的插入以从左侧和右侧推入它,如下所示: c.insets = new Insets(0, 40, 0, 40);

这里的值40只是一个例子。您可以将参数更改为任何适合的参数。

  1. 您可以使用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不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的poi autoSizeColumn()不起作用

css 为啥有时MARGIN 不起作用,

关于Animate css不起作用的原因

PHP.INI不起作用

transpportrule不起作用

为啥 innerHtml 不起作用