1

我有一个包含两个组件的 GridBagLayout:JRadioButton 和 JLabel。标签中的文本因长度而异。这个 GridbagLayout 被添加到 JPanel。因此,当我有很多组件时,它们最终并没有很好地对齐。这就是我的意思:

-----radio btn-label-----
---radio btn-label     --
-------radio btn-lbl-----

但我需要以下内容:

-radio btn-label        -
-radio btn-label        -
-radio btn-lbl          -

这就是我的网格现在的样子:

public class MyPanel extends JPanel {
private JLabel info;
private JRadioButton select;

public MyPanel() {
    this.achiev = achiev;
    achievementInfo = new JLabel();
    selectAchiev = new JRadioButton();

    setLayout(new GridBagLayout());
    GridBagConstraints constraints = new GridBagConstraints();

    constraints.gridx = 0;
    constraints.gridy = 0;
    constraints.anchor = GridBagConstraints.LINE_START;
    add(selectAchiev, constraints);

    StringBuilder builder = new StringBuilder();
    builder.append("<html><b>").append("some text").append("</b><p>");
    builder.append("<i>").append("some more text").append("</i>");
    info.setText(builder.toString());
    constraints.gridx = 1;
    constraints.gridy = 0;
    constraints.fill = GridBagConstraints.HORIZONTAL;
    add(info, constraints);
}

//--------------

JPanel panel = new JPanel(new BoxLayout(), BoxLayout.YAXIS);
for(int i = 0; i < 10; ++i) {
    panel.add(new MyPanel());
}
4

2 回答 2

3

您要添加 10 个面板,它们都有自己的网格包布局、复选框和标签。所以每个面板都有自己的网格,并且单元格的宽度是根据它们包含的组件独立计算的。

如果你想要一个对齐良好的单个网格,你应该有一个使用 GridBagLayout 的面板,并将你的 10 个标签和 10 个复选框添加到这个独特的面板中。

此外,如果您真的希望标签的约束水平填充,您应该为标签的约束赋予 weightx > 0。

于 2013-08-17T13:47:40.773 回答
2

我想你错过了这个GrigBadLayout 文档中所说的weightx ,重量限制:

除非您为 weightx 或 weighty 指定至少一个非零值,否则所有组件都会在其容器的中心聚集在一起。这是因为当权重为 0.0(默认值)时,GridBagLayout 会在其单元格网格和容器边缘之间放置任何额外的空间。

如果你想让你的组件看起来像这样,我指的是使用BoxLayout

private void init() {
    Box outerBox = new Box(BoxLayout.Y_AXIS);
    outerBox.add(createLineWithRadioButtonAndLabel());//line 1
    outerBox.add(createLineWithRadioButtonAndLabel());//line 2
    outerBox.add(createLineWithRadioButtonAndLabel());//line 3

    add(outerBox);
}

private Box createLineWithRadioButtonAndLabel() {
    Box line = new Box(BoxLayout.X_AXIS);
    JRadioButton radio = new JRadioButton("radio button");
    JLabel label = new JLabel("some text");

    line.add(radio);
    line.add(Box.createRigidArea(new Dimension(20, 1)));// add some horizontal space. Here is 20
    line.add(label);
    line.add(Box.createHorizontalGlue());

    return line;
}
于 2013-08-17T15:04:36.663 回答