Java 确定网格包布局中的单元格是否被占用

Java 确定网格包布局中的单元格是否被占用,java,swing,awt,layout-manager,gridbaglayout,Java,Swing,Awt,Layout Manager,Gridbaglayout,我在网格袋布局中有n个组件。这些组件的gridwidth和gridheight可以为1或更多。可以有n行,但每行最多只有2个组件 是否需要检查gridbag单元格是否已被占用。因此,如果组件“A”的高度为2,并且位于单元格0x0中,我可以找到0x1是否已被占用,并跳过在其中放置组件 我考虑使用boolean[][]数组,但最大行数和最大列数可能会根据布局而变化(用户可以上下移动组件,删除它们,然后添加它们) 另一个注意事项是组件被添加为 0x0->0x1 1x0->1x1好的,所以我最终解决了这

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

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

我考虑使用
boolean[][]
数组,但最大行数和最大列数可能会根据布局而变化(用户可以上下移动组件,删除它们,然后添加它们)

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

1x0->1x1

好的,所以我最终解决了这个问题,制作了一个
布尔[]
s的
数组列表。在我的例子中,我知道只有两列。如果您不确定,可能需要制作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);
        }
    }
private void updateTableLayout(){
//tableHolderPanel保存JxtitledPanel
GridBagLayout gbl=(GridBagLayout)tableHolderPanel.getLayout();
已占用列表=新建ArrayList();
add(新的布尔值[]{false,false});
int x=0;
int y=0;
布尔未放置;
for(TableJXPanel表:tableList){
GridBagConstraints gbc=gbl.getConstraints(表);
notPlaced=true;
while(未放置){
如果(!已占用。获取(y)[x]){
//将true设置为占用的第一个单元格
已占用。获取(y)[x]=true;
如果(gbc.gridwidth>1&&x==0){
已占用。获取(y)[1]=真;
}
//添加任何其他单元格并进行设置。
对于(int i=0;i1){
add(新的布尔值[]{true,true});
}否则{
add(新的布尔值[]{false,false});
已占用。获取(y+1)[x]=true;
}
}
//为下一次比较添加新行
if(已占用。获取(y)[1])
add(新的布尔值[]{false,false});
//表示桌子已经放好了
notPlaced=false;
gbc.gridy=y;
gbc.gridx=x;
}
如果(x==0){
x++;
}否则{
x=0;
y++;
}
}
桌架面板。移除(桌子);
tableHolderPanel.add(表,gbc);
}
}
这可能不是最好的代码,因此如果有人看到应该更改的内容,请留下评论