3

私が取り組んでいるJavaプロジェクトでは、GridBagLayoutを使用してUIをレイアウトしています。UIのすべてのコンポーネントには、GridBagConstraintsがコンポーネントをUIに配置するために使用するx座標とy座標が関連付けられています。

UIの座標(x、y)に特定のコンポーネントを配置するメソッドaddAt(component、x、y、constraints)があります。

UIを設定するために次のことを行うのではなく、次のようにします。

addAt(component1, 3, 1, constraints);
addAt(component2, 3, 2, constraints);
addAt(component3, 3, 3, constraints);
addAt(component4, 3, 4, constraints);

各コンポーネントの座標をオブジェクト自体に保存したいので、次のようになります。

addAt(component1, constraints);
addAt(component2, constraints);
addAt(component3, constraints);
addAt(component4, constraints);

これを行うための現在のアプローチは、使用しているすべてのJComponentの基本クラスをオーバーライドし、メソッドgetXCoord()およびgetYCoord()を使用してインターフェースを実装することです。

JComponentsにはgetX()メソッドとgetY()メソッドがあることを確認しましたが、これらのメソッドの目的は、私が目指しているものとは異なります。

したがって、基本的に、上記の情報を前提として、個々のJComponentのオーバーライドされたバージョンを作成するよりも、この機能を実装するためのよりクリーンな方法はありますか?ここで明らかな何かが欠けている場合は、お詫び申し上げます。

4

1 に答える 1

3

メディエーターまたはget/putClientPropertyメソッドを使用して、コンポーネントと座標間の関連付けを格納し、それを照会してaddAtメソッドの座標を取得できます。

座標は次のようになります。

class Coordinates {
  private final int x;
  private final int y;
  public Coordinates(int x, int y) {
    this.x = x;
    this.y = y;
  }
  public int getX() { return x; }
  public int getY() { return y; }
}

そして、あなたはあなたの中でそれを使用しますaddAt

private void addAt(JComponent component, GridBagConstraints constraints) {
  Coordinates coordinates = (Coordinates)component.getClientProperty("coords");
  int x = coordinates.getX();
  int y = coordinates.getY();

  // place it in the grid...
}

たとえば、次のように関連付けを作成します。

public void setUpComponentsCoordinates() {
  component1.putClientProperty("coords", new Coordinates(3, 1));
  component2.putClientProperty("coords", new Coordinates(3, 2));
  component3.putClientProperty("coords", new Coordinates(3, 3));
  component4.putClientProperty("coords", new Coordinates(3, 4));
}
于 2012-10-22T01:34:48.290 に答える