6

为了使一些 Swing 代码更具可读性,我创建了一个InlineGridBagConstraints如下所示的类:

public class InlineGridBagConstraints extends GridBagConstraints {

public InlineGridBagConstraints gridx(int x) {
    gridx = x;
    return this;
}

public InlineGridBagConstraints gridy(int y) {
    gridy = y;
    return this;
}

public InlineGridBagConstraints gridheight(int h) {
    gridheight = h;
    return this;
}

public InlineGridBagConstraints gridwidth(int w) {
    gridwidth = w;
    return this;
}

    // .... and so on, for all fields.

}

目的是改变这种代码:

GridBagConstraints c = new GridBagConstraints();
c.gridx = 2;
c.gridy = 1;
c.gridwidth = 3;
myJPanel.add(myJButton, c);

c.gridx = 3;
c.gridwidth = 2;
myJPanel.add(myOtherJButton, c);

c.gridx = 1;
c.gridy = 5;
c.gridheight = 4;
myJPanel.add(yetAnotherJButton, c);

...有一些更容易理解和阅读的东西,比如:

InlineGridBagConstraints c = new InlineGridBagConstraints();
myJPanel.add(myJButton, c.gridx(2).gridy(1).gridwidth(3));
myJPanel.add(myOtherJButton, c.gridx(3).gridy(1).gridwidth(2);
myJPanel.add(yetAnotherJButton, c.gridx(1).gridy(5).gridheight(4);

但是,上面的代码不起作用。当我尝试它时,所有组件都占据中心的同一区域JPanel并相互重叠。它们在GridBagLayout. 但是,如果我将更丑的版本与常规一起使用GridBagConstraints,则它可以按预期完美运行。

我曾尝试对 into 进行类型转换InlineGridBagConstraintsGridBagConstraints认为这可能是一个问题(即使它不应该是),但这根本没有帮助。

我已经没有想法了。有谁知道为什么会发生这种情况,或者第一个(标准)和第二个(内联)实现之间的主要区别是什么?

4

2 回答 2

2

就我可以依靠您所写的内容而言,这应该可行。所以,我建议开始寻找代码中的其他错误。

您在两个示例中都正确设置了 LayoutManager 吗?

更新:尝试摆脱构造函数中的重置调用。超类构造函数将正确地完成这项工作。

于 2012-09-11T19:56:27.370 回答
2

我真的不知道你的GUIConstants定义是什么,因为我们没有看到它,但是将 reset() 方法更改为InlineGridBagConstraints下面的方法,会使你的 UI 看起来像你预期的那样:

  public InlineGridBagConstraints reset() {
    gridx = 0;
    gridy = 0;
    gridheight = 1;
    gridwidth = 1;
    insets = new Insets(5, 5, 5, 5);
    fill = GridBagConstraints.BOTH;
    anchor = GridBagConstraints.CENTER;
    return this;
  }
于 2012-09-11T20:28:58.783 回答