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意図したとおりに完全に機能します。

おそらくそれが問題であると考えて(そうあるべきではありませんが)、に型キャストしてみInlineGridBagConstraintsましたが、まったく役に立ちませんでした。GridBagConstraints

アイデアが尽きた。なぜこれが発生しているのか、または最初の (標準) 実装と 2 番目の (インライン) 実装の主な違いは何ですか?

4

2 に答える 2

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 に答える
2

あなたが書いたものに頼ることができる限り、これはうまくいくはずです。したがって、コード内の他のバグを探し始めることをお勧めします。

両方の例で LayoutManager を正しく設定していますか?

更新:コンストラクターでリセット呼び出しを取り除くようにしてください。スーパー クラス コンストラクターは正しく機能します。

于 2012-09-11T19:56:27.370 に答える