3

在我正在处理的 Java 项目中,我使用 GridBagLayout 来布置我的 UI。UI 中的每个组件都与一个 x 和 y 坐标相关联,GridBagConstraints 使用该坐标将组件放置在 UI 中。

我有一个 addAt(component, x, y, constraints) 方法,它将给定组件放置在 UI 中的坐标 (x,y) 处。

而不是执行以下操作来设置我的 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);

我目前这样做的方法是覆盖我正在使用的所有 JComponents 的基类,并使用方法 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 回答