GridBag 未显示行中的所有组件

GridBag not displaying all components in row

我使用 GridBagLayout 实现了 JPanel,如下所示:

fileSelectionDetails = new JPanel();
fileSelectionGridBagLayout = new GridBagLayout();
fileSelectionDetails.setLayout(fileSelectionGridBagLayout);


JLabel lblFile1 = new JLabel("File 1:");
JTextField txtFile1Path = new JTextField();    
JButton btnBrowseFile1 = new JButton("Browse...");

addComponentToFileSelectionGrid(lblFile1, 0, 0, 1, 1, 20, 100, GridBagConstraints.NONE, GridBagConstraints.WEST);
addComponentToFileSelectionGrid(txtFile1Path, 1, 0, 3, 1, 60, 100, GridBagConstraints.HORIZONTAL, GridBagConstraints.WEST);
addComponentToFileSelectionGrid(btnBrowseFile1, 2, 0, 1, 1, 20, 100, GridBagConstraints.HORIZONTAL, GridBagConstraints.WEST);

private void addComponentToFileSelectionGrid(Component component, int gridX, int gridY,
                            int gridWidth, int gridHeight, int weightX, 
                            int weightY, int fill, int anchor) {

    GridBagConstraints constraint = new GridBagConstraints();
    constraint.gridx = gridX;
    constraint.gridy = gridY;
    constraint.gridwidth = gridWidth;
    constraint.gridheight = gridHeight;
    constraint.weightx = weightX;
    constraint.weighty = weightY;       
    constraint.fill = fill;
    constraint.anchor = anchor;
    fileSelectionGridBagLayout.setConstraints(component, constraint);
    fileSelectionDetails.add(component);
}

我想查看我的组件布局如下:

然而,我实际看到的是:

即'Browse...' 按钮不见了!这是为什么?

您为 txtFile1Path 定义了 gridWidth=3,但在 gridX=2 处添加了 btnBrowseFile1。您必须设置 addComponentToFileSelectionGrid(btnBrowseFile1, 4 ...等

从你的绘图来看,我猜你根本不需要相对宽度。您似乎希望标签和按钮成为它们的首选大小,并且拉伸 JTextField 以占据标签和按钮未使用的所有宽度。

正如 camickr 所建议的,您应该通过使用列数对其进行初始化来为 JTextField 提供有意义的首选大小,例如 new JTextField(20).

然后您可以利用 GridBagLayout 和 GridBagConstraints 的一些有用方面:

  • gridx和gridy的默认值是RELATIVE,也就是说你添加的每个组件都放在最后一个添加的组件的右边。这恰好正是你想要的。因此,您根本不应该设置 gridx 或 gridy。
  • gridwidth和gridheight的默认值为1,这就是你想要的。 GridBagLayout 单元格是灵活的,因此将一个组件的网格宽度设置为 3 不会 使其比网格宽度为 1 的组件宽三倍。单元格的宽度或单元格的跨度完全取决于关于它包含的内容。
  • 当您将组件添加到 GridBagLayout 时,GridBagConstraints 对象被克隆到 GridBagLayout 中。这意味着您可以安全地反复重用同一个 GridBagConstraints 对象,只更改需要更改的字段。

有了这些知识,您的代码可以简化为:

fileSelectionDetails = new JPanel(new GridBagLayout());

JLabel lblFile1 = new JLabel("File 1:");
JTextField txtFile1Path = new JTextField(20);
JButton btnBrowseFile1 = new JButton("Browse\u2026");

txtFile1Path.setMinimumSize(txtFile1Path.getPreferredSize());

GridBagConstraints constraints = new GridBagConstraints();
constraints.fill = GridBagConstraints.HORIZONTAL;

constraints.weight = 0;
fileSelectionDetails.add(lblFile1, constraints);
constraints.weight = 1;
fileSelectionDetails.add(txtFile1Path, constraints);
constraints.weight = 0;
fileSelectionDetails.add(btnBrowseFile1, constraints);