2

您好 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 上会更好吗?实际上,将它放在那里似乎更有意义。不过我不太确定。

4

2 回答 2

2

我不确定您对该项目的要求是什么,但我会查看Spring 布局- 此布局可让您指定以下内容:

the left of [1] should be 10 pixels from the left of the panel
the right of [1]  should be 10 pixels from the left of [2]
etc.

像您在这里描述的那样实现一个漂亮的流体布局要容易得多(imo)。

编辑:只是尝试添加到讨论中:

也许你可以有一个从 Panel 扩展的名为 PortraitPanel 的类,在那里你可以维护一个图像面板列表。你可以有公共方法: add(int index); 删除(整数索引);

因此,当您调用 add(2) 时,它将将该面板添加到该索引处的列表中 - 然后在索引 - 1 和索引 + 1 处获取面板并执行例程来调整这些约束,以便将它们布置在新添加的面板的任一侧。同样,对于删除,您可以使用 index - 1 并将其约束设置为在 index + 1 旁边布局,然后删除索引处的项目。同样,如果您使用 SpringLayout ,那么设置它非常容易,以便在窗口调整大小等时保持流畅。

希望这与您正在尝试做的事情一致。

于 2012-06-12T19:21:45.650 回答
2

示例显示可以从容器中删除所有组件并以任意顺序完全替换每个组件。封闭容器所需的时间validate()可以忽略不计,因为组件本身保持不变。

于 2012-06-12T19:55:01.907 回答