干净地为很多课程添加一些功能

时间:2012-10-22 00:26:10

标签: java swing user-interface

在我正在研究的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的重写版本?如果我在这里遗漏了一些明显的东西,我道歉。

1 个答案:

答案 0 :(得分: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));
}