【发布时间】:2012-06-12 17:42:35
【问题描述】:
您好 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 的位置。这样,我可以得到[3]的位置,得到[4]的位置,将[4]s的位置设置为[3]的位置,然后(如果有[5],设置[5]的位置位置到[4] 的旧位置等等,直到我到达最后一个元素。
感觉太“蛮力”了,不得不添加这些整数,我觉得如果我要为每个对象制作一个单独的 GridBagConstraint 会更糟。有没有更好的方法来完成我需要做的这种转变?
对不起,这个问题很长。我没想到会这么久。我希望这仍然可以。如果我不清楚并且您需要任何澄清,请不要犹豫!
编辑:如果这是在 CodeReview stackexchange 上会更好吗?实际上,将它放在那里似乎更有意义。不过我不太确定。
【问题讨论】:
标签: java swing gridbaglayout