【问题标题】:placing components using GridBagLayout() is not giving desired result使用 GridBagLayout() 放置组件没有得到想要的结果
【发布时间】:2014-02-14 21:58:34
【问题描述】:

我想创建一个数据输入选项卡,如下所示以及几个按钮:

其中所有文本字段的宽度为 3,“姓名”和“支付金额”的高度为 1,而地址的高度为 3。它们之间有 1 条线的垂直间隙。

为此我编写了如下代码:(data_panel 与 button_panel 分离,以便更好地放置组件)

private JLabel label_name;
private JTextField text_name;

private JLabel label_address;
private JTextField text_address;

private JLabel label_amount_paid;
private JTextField text_amount_paid;

private JButton button_add_member;
private JButton button_remove_member;
private JButton button_remove_all;

public TabPanesAddRemove() {
    setLayout(new GridLayout(2, 1));

    JPanel data_panel = new JPanel(new GridBagLayout()); // data entry panel
    GridBagConstraints gbc = new GridBagConstraints();
    // gbc.fill = GridBagConstraints.HORIZONTAL;
    gbc.gridx = 1;
    gbc.gridy = 1;
    gbc.gridwidth = 1;
    label_name = new JLabel("Name: ");
    data_panel.add(label_name, gbc);

    text_name = new JTextField(20);
    text_name.setName("name");
    gbc = new GridBagConstraints();
    // gbc.fill = GridBagConstraints.HORIZONTAL;
    gbc.gridx = 2;
    gbc.gridy = 1;
    gbc.gridwidth = 3;
    data_panel.add(text_name, gbc);

    label_address = new JLabel("Address: ");
    gbc = new GridBagConstraints();
    // gbc.fill = GridBagConstraints.HORIZONTAL;
    gbc.gridx = 1;
    gbc.gridy = 3;
    gbc.gridwidth = 1;
    data_panel.add(label_address, gbc);

    text_address = new JTextField(20);
    text_address.setName("address");
    gbc = new GridBagConstraints();
    // gbc.fill = GridBagConstraints.HORIZONTAL;
    gbc.gridx = 2;
    gbc.gridy = 3;
    gbc.gridwidth = 3;
    gbc.gridheight = 3;
    data_panel.add(text_address, gbc);

    label_amount_paid = new JLabel("Amount Paid: ");
    gbc = new GridBagConstraints();
    // gbc.fill = GridBagConstraints.HORIZONTAL;
    gbc.gridx = 1;
    gbc.gridy = 7;
    gbc.gridwidth = 1;
    // gbc.gridheight = 1;
    data_panel.add(label_amount_paid);

    text_amount_paid = new JTextField(20);
    text_amount_paid.setName("amount");
    gbc = new GridBagConstraints();
    // gbc.fill = GridBagConstraints.HORIZONTAL;
    gbc.gridx = 2;
    gbc.gridy = 7;
    gbc.gridwidth = 3;
    data_panel.add(text_amount_paid);

    add(data_panel);

    JPanel buttons_panel = new JPanel(); // button panel
    button_add_member = new JButton(BUTTON_ADD);
    button_remove_member = new JButton(BUTTON_REMOVE);
    button_remove_all = new JButton(BUTTON_REMOVE_ALL);
    buttons_panel.add(button_add_member);
    buttons_panel.add(button_remove_member);
    buttons_panel.add(button_remove_all);
    add(buttons_panel);

    Event ev = new Event();
    button_add_member.addActionListener(ev);
    button_remove_member.addActionListener(ev);
    button_remove_all.addActionListener(ev);
}

这段代码给了我如下输出:

仔细观察:

我尝试了各种更改,包括使用gbc.fill 以及JTextField()gbc.gridxgbc.gridy 中的不同尺寸等。但我无法得到想要的结果。

谁能帮我解决问题?

【问题讨论】:

  • 我可以建议您使用 WindowBuilder 插件吗?不仅省了很多工作,还可以通过查看生成的代码来学习

标签: java swing user-interface awt gridbaglayout


【解决方案1】:

也许这会对你有所帮助。我知道它并不完全符合您的要求,但我猜它演示了如何很好地使用 GB 布局:

public class MainF extends JFrame {

public static void main(String[] args) {
    MainF f = new MainF();
    f.setVisible(true);

}


public MainF() {
    this.setDefaultCloseOperation(EXIT_ON_CLOSE);
    this.setBounds(100, 100, 600, 300);

    Dimension tfSize = new Dimension(200, 25);
    JPanel dataP = new JPanel();
    dataP.setLayout(new GridBagLayout());

    GridBagConstraints c = new GridBagConstraints();

    JLabel label = new JLabel("Name:");

    c.gridx = 1;
    c.gridy = 1;
    c.anchor = GridBagConstraints.NORTHEAST;

    dataP.add(label, c);

    JTextField tf = new JTextField(30);
    tf.setMinimumSize(tfSize);
    tf.setMaximumSize(tfSize);
    tf.setPreferredSize(tfSize);
    c = new GridBagConstraints();
    c.gridx = 2;
    c.gridy = 1;
    c.gridwidth = 3;
    dataP.add(tf, c);

    label = new JLabel("Address:");
    c = new GridBagConstraints();
    c.gridx = 1;
    c.gridy = 2;
    c.anchor = GridBagConstraints.NORTHEAST;
    dataP.add(label, c);

    tf = new JTextField(30);
    tf.setMinimumSize(tfSize);
    tf.setMaximumSize(tfSize);
    tf.setPreferredSize(tfSize);
    c = new GridBagConstraints();
    c.gridx = 2;
    c.gridy = 2;
    c.gridwidth = 3;
    dataP.add(tf, c);

    label = new JLabel("Amount Paid:");
    c = new GridBagConstraints();
    c.gridx = 1;
    c.gridy = 3;
    c.anchor = GridBagConstraints.NORTHEAST;
    dataP.add(label, c);

    tf = new JTextField(30);
    tf.setMinimumSize(tfSize);
    tf.setMaximumSize(tfSize);
    tf.setPreferredSize(tfSize);
    c = new GridBagConstraints();
    c.gridx = 2;
    c.gridy = 3;
    c.gridwidth = 3;
    dataP.add(tf, c);

    JButton button = new JButton("Add Member");
    c = new GridBagConstraints();
    c.gridx = 2;
    c.gridy = 5;
    dataP.add(button, c);

    button = new JButton("Remove Member");
    c = new GridBagConstraints();
    c.gridx = 3;
    c.gridy = 5;
    dataP.add(button, c);

    button = new JButton("Remove All Members");
    c = new GridBagConstraints();
    c.gridx = 4;
    c.gridy = 5;
    dataP.add(button, c);
    this.add(dataP);
}

}

【讨论】:

    【解决方案2】:

    问题是,您在添加label_amount_paidtext_amount_paid 时忘记传递GridBagConstraints

    label_amount_paid = new JLabel("Amount Paid: ");
    gbc = new GridBagConstraints();
    //...
    data_panel.add(label_amount_paid); // Missing constraints
    
    text_amount_paid = new JTextField(20);
    text_amount_paid.setName("amount");
    gbc = new GridBagConstraints();
    //...
    data_panel.add(text_amount_paid); // Missing constraints
    

    请记住,默认情况下,x/y 位置是基于 0 的。

    label_amount_paid = new JLabel("Amount Paid: ");
    gbc = new GridBagConstraints();
    //...
    data_panel.add(label_amount_paid, gbc);
    
    text_amount_paid = new JTextField(20);
    text_amount_paid.setName("amount");
    //...
    gbc = new GridBagConstraints();
    data_panel.add(text_amount_paid, gbc);
    

    我也会非常小心gridWidthgridHeight

    【讨论】:

    • 感谢您指出缺少的约束...但输出仍然不理想..可能是什么问题?如果根据给定的约束看不到高度和宽度,那么提供 gridxgridygridwidthgridheight 等约束有什么用?
    • 使用 JTextArea 而不是 JTextField,根据您的要求设置其列和行。 gridx/gridy 指的是组件应该占据的单元格位置,gridwidth/height 决定了组件应该扩展多少列/行。但请记住,与 GridLayout 不同,列/行大小由占据它的组件决定,这意味着即使一个组件扩展 n 行,这些行中不存在任何其他内容,那么它不会对组件产生任何影响。 .
    • 你当前的输出是什么,还有什么问题?
    猜你喜欢
    • 1970-01-01
    • 2016-03-14
    • 2022-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多