提问者:小点点

Java Swing GridBagLayout:可以创建不同列数的行吗?


我是JavaSwing的新手,我必须编写一个如下所示的接口:

它是一个复选框,后跟一个文本字段,然后是一个按钮。不要介意虚线,我添加它们只是为了使“网格”可见,我知道我可以制作一个组件并为复选框、文本和按钮重用,这样布局就简单多了。我只是想了解GridbagLayout的怪癖。

基本上,第一行应该有2列,第二行和第三行应该有6列。为此,我尝试使用GridBagLayout,但结果不是预期的,我不确定我是否遗漏了什么,或者如果没有内部面板就不可能做到这一点。这是我的课:

import javax.swing.*;
import java.awt.*;

public class GridBagLayoutTest extends JFrame {

    JPanel panel = new JPanel();

    public GridBagLayoutTest(){

        setTitle("Grid Bag Layout Test");
        GridBagLayout layout = new GridBagLayout();
        panel.setLayout(layout);
        GridBagConstraints gbc = new GridBagConstraints();
        setLayout(new GridBagLayout());

        gbc.anchor = GridBagConstraints.NORTHWEST;
        gbc.weightx=1; // set to use all horizontal space available
        gbc.weighty=0;

        gbc.fill = GridBagConstraints.HORIZONTAL;
        gbc.insets = new Insets(2,2,2,2);

        // Labels line. Each label should be 50%
        gbc.gridx = 0;
        gbc.gridy = 0;
        panel.add(new JLabel("Label 1"), gbc);

        gbc.gridx = 1;
        gbc.gridy = 0;
        panel.add(new JLabel("Label 2"), gbc);

        // Checkbox left group. The three components should take 50% of the total width
        gbc.gridx = 0;
        gbc.gridy = 1;
        panel.add(new JCheckBox("Ind 1"), gbc);

        gbc.gridx = 1;
        gbc.gridy = 1;
        panel.add(new JTextField(), gbc);

        gbc.gridx = 2;
        gbc.gridy = 1;
        panel.add(new JButton("..."), gbc);

        // Checkbox right group. The three components should take 50% of the total width
        gbc.gridx = 3;
        gbc.gridy = 1;
        panel.add(new JCheckBox("Ind 1"), gbc);

        gbc.gridx = 4;
        gbc.gridy = 1;
        panel.add(new JTextField(), gbc);

        gbc.gridx = 5;
        gbc.gridy = 1;
        panel.add(new JButton("..."), gbc);


        setContentPane(panel);
        this.setSize(800,200 );
        setPreferredSize(getSize());
        setVisible(true);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    }
}

如果没有内部面板就可以实现这一点,那么我的代码中缺少了什么?


共1个答案

匿名用户

    gbc.gridx = 0;
    gbc.gridy = 0;
    panel.add(new JLabel("Label 1"), gbc);

    gbc.gridx = 1;
    gbc.gridy = 0;
    panel.add(new JLabel("Label 2"), gbc);

第二个标签应从第3列开始:

    gbc.gridx = 0;
    gbc.gridy = 0;
    panel.add(new JLabel("Label 1"), gbc);

    gbc.gridx = 3; // changed
    gbc.gridy = 0;
    panel.add(new JLabel("Label 2"), gbc);