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);
我使用 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);