gpt4 book ai didi

java - 确定网格袋布局中的单元格是否被占用

转载 作者:行者123 更新时间:2023-12-01 15:12:30 24 4
gpt4 key购买 nike

我的网格袋布局中有 n 个组件。这些组件的网格宽度和网格高度可以为 1 或更大。可以有 n 行,但每行最多只有 2 个组件。

是否有办法检查 gridbag 单元是否已被占用。因此,如果组件“A”的高度为 2 并且位于单元格 0x0 中,我可以找到 0x1 是否被占用并跳过在那里放置组件?

我考虑过一个 boolean[][] 数组,但最大行数和列数可以根据布局而变化(用户可以上下移动组件、删除它们并添加它们) .

另一个注意事项是组件被添加为
0x0 -> 0x1
1x0 -> 1x1

最佳答案

好吧,我最终解决了这个问题,我制作了一个 Boolean[]ArrayList。在我的例子中,我知道只有两列。如果您不确定,您可能想做一个 2d ArrayList。

private void updateTableLayout() {
//tableHolderPanel holds the JXTitledPanels
GridBagLayout gbl = (GridBagLayout) tableHolderPanel.getLayout();
List<Boolean[]> occupied = new ArrayList<Boolean[]>();
occupied.add(new Boolean[]{false, false});
int x = 0;
int y = 0;
boolean notPlaced;
for (TableJXPanel table : tableList) {
GridBagConstraints gbc = gbl.getConstraints(table);
notPlaced = true;

while (notPlaced) {
if (!occupied.get(y)[x]) {
//Set true to first cell occupied
occupied.get(y)[x] = true;
if (gbc.gridwidth > 1 && x == 0) {
occupied.get(y)[1] = true;
}

//Add any additional cells and set them.
for (int i = 0; i < gbc.gridheight - 1; i++) {
if (gbc.gridwidth > 1) {
occupied.add(new Boolean[]{true, true});
} else {
occupied.add(new Boolean[]{false, false});
occupied.get(y+1)[x] = true;
}
}
//Add new row for next comparison
if(occupied.get(y)[1])
occupied.add(new Boolean[]{false, false});

//signal that the table was placed
notPlaced = false;
gbc.gridy = y;
gbc.gridx = x;
}
if (x == 0) {
x++;
} else {
x = 0;
y++;
}
}
tableHolderPanel.remove(table);
tableHolderPanel.add(table, gbc);
}
}

这可能不是最好的代码,因此如果有人看到需要更改的内容,请发表评论。

关于java - 确定网格袋布局中的单元格是否被占用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12144788/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com