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