您好 StackOverflow 用户!
我有一个问题,我确实找到了问题的解决方案,但我觉得解决方案不是最佳的。我觉得我使用蛮力来实现我想做的事情,并且想知道是否有更好的方法来实现我想要的事情。
基本上我所拥有的是一个使用 GridBagLayout 的 Java GUI 应用程序。我使用 GridBagLayout 因为布局基本上总是居中对齐。当添加其他内容时,它会向上、向下、向左或向右移动所有内容(取决于添加新对象的位置)。问题是我的程序还需要删除某些对象(取决于其他代码块中发生的情况)。所以假设我有四个像这样排列的对象[1] [2] [3] [4]
,我想删除[3]
. 我本质上希望布局更改为[1] [2] [3]
,本质上是在[3]
. 在视觉上这样做没有问题(因为 GridBagLayout 的工作原理)。然而,当新的东西被添加到显示中时,会出现重叠,因为虽然[4]
占据了视觉位置[3]
,GridBagPosition(不知道还能叫什么)没有改变。所以我为删除过程实现了下面的代码。
public void removeSubImagePanel (int subPanelIdx) {
int x, y, nextX, nextY;
this.remove(this.portraits[subPanelIdx]);
nextX = this.portraits[subPanelIdx].getGbx();
nextY = this.portraits[subPanelIdx].getGby();
for (int i = subPanelIdx; i < this.numberOfPortraits; i++) {
x = nextX;
y = nextY;
this.portraits[i] = this.portraits[i+1];
if (this.portraits[i+1] != null) {
nextX = this.portraits[i+1].getGbx();
nextY = this.portraits[i+1].getGby();
this.portraits[i].getObject().setSubPanelIdx(i);
gbc.gridx = x;
gbc.gridy = y;
this.portraits[i].setGbLocation(x, y);
gb.setConstraints(this.portraits[i], gbc);
}
}
this.portraits[this.numberOfPortraits] = null;
this.numberOfPortraits--;
}
本质上,我向“肖像”对象添加了两个整数变量,以保持 GridBagLayout 上 X 和 Y 的位置。这样,我可以得到 position [3]
,得到[4]
set[4]
的位置到 where [3]
's 的位置,然后(如果有 a [5]
, set[5]
的位置到[4]
's 的旧位置等等,直到我到达最后一个元素。
感觉太“蛮力”了,不得不添加这些整数,我觉得如果我要为每个对象制作一个单独的 GridBagConstraint 会更糟。有没有更好的方法来完成我需要做的这种转变?
对不起,这个问题很长。我没想到会这么久。我希望这仍然可以。如果我不清楚并且您需要任何澄清,请随时提问!
编辑:如果这是在 CodeReview stackexchange 上会更好吗?实际上,将它放在那里似乎更有意义。不过我不太确定。