如何使用GridBagLayout使所有组件出现在JPanel的中心?

时间:2015-05-20 13:47:31

标签: java swing jpanel layout-manager gridbaglayout

我有以下代码。但我希望所有组件都出现在JPanel的中心。我已经花了无数个小时,但每次都失败了。有人可以帮忙吗?

package tg.com.bugtracker;

import java.awt.*;

import javax.swing.*;

@SuppressWarnings("serial")
public class LoginPanel extends JPanel {    
    LoginPanel() {
        GridBagLayout layout = new GridBagLayout();
        setLayout(layout);
        GridBagConstraints constraints = new GridBagConstraints();
        constraints.gridx = 0;
        constraints.gridy = 0;
        constraints.anchor = GridBagConstraints.LAST_LINE_END;
        add(new JLabel("Username"), constraints);
        constraints.gridx = 1;
        constraints.gridy = 0;
        constraints.anchor = GridBagConstraints.LAST_LINE_START;
        JComboBox<String> combobox = new JComboBox<>();
        combobox.setPreferredSize(new Dimension(250, 20));
        add(combobox, constraints);
        constraints.gridx = 0;
        constraints.gridy = 1;
        constraints.anchor = GridBagConstraints.FIRST_LINE_END;
        add(new JLabel("Password"), constraints);
        constraints.gridx = 1;
        constraints.gridy = 1;
        constraints.anchor = GridBagConstraints.FIRST_LINE_END;
        JTextField textfield = new JTextField();
        textfield.setPreferredSize(new Dimension(250, 20));
        add(textfield, constraints);
    }
}

2 个答案:

答案 0 :(得分:1)

将一组组件集中在GUI区域中的一种相当简单的方法是将它们放置在面板和面板中。创建一个 (或另一个)GridBagLayout面板。然后将带有组件的面板作为单个放入GBL 没有约束的组件。完成工作!

顺便说一下,当我创建该代码的MCVE(Minimal Complete Verifiable Example)时,我删除了一个实例 将LoginPanel放入CENTER的{​​{1}}中,确实似乎是居中的。

一般提示

请参阅Should I avoid the use of set(Preferred|Maximum|Minimum)Size methods in Java Swing?(是)。

文本字段的大小可以通过列数和字体大小来建议。 组合框将采用内容的大小,这将归结为最宽的组合项和使用的渲染器。

答案 1 :(得分:0)

好的,首先我不太了解你的问题,我想你想把它们放在中心,但我不知道你为什么要使用锚。您正在使用的锚点会使对象显示在“行结束”或“行开始”中,但您希望它们位于中心,因此您应该使用:

constraints.anchor = GridBagConstraints.CENTER; //BIG MOTHER OF GOD REDUNDANCE

这是一个冗余,因为锚的默认值是中心,你不应该使用setBounds,而且我不知道你为什么要设置大小,网格总是大小的列中最大的对象。如果您正在尝试做的事情是填充网格,您应该使用:

constraints.fill = GridBagConstraints.HORIZONTAL;

或垂直或两者取决于您想要填充它的方向。 因此,如果您希望所有内容都显示在中心,请更正您的代码&#34;

package tg.com.bugtracker;

import java.awt.*;

import javax.swing.*;

@SuppressWarnings("serial")
public class LoginPanel extends JPanel {    
    LoginPanel() {
        GridBagLayout layout = new GridBagLayout();
        setLayout(layout);
        GridBagConstraints constraints = new GridBagConstraints(); 
        constraints.gridx = 0;
        constraints.gridy = 0;
        constraints.anchor = GridBagConstraints.CENTER; //Redundance but I leaved it for you to see the change.
        add(new JLabel("Username"), constraints);
        constraints.gridx = 1;
        constraints.gridy = 0;
        JComboBox<String> combobox = new JComboBox<>();
        combobox.setPreferredSize(new Dimension(250, 20));
        add(combobox, constraints);
        constraints.gridx = 0;
        constraints.gridy = 1;
        add(new JLabel("Password"), constraints);
        constraints.gridx = 1;
        constraints.gridy = 1;
        JTextField textfield = new JTextField();
        textfield.setPreferredSize(new Dimension(250, 20));
        add(textfield, constraints);

    }
}

现在所有的对象都应该出现在中心,我建议你在Stack Overflow中找到关于GridBagLayout的this post,非常有趣,它有一些常见的错误,几乎涵盖了这个很棒的布局。