0

グリッドバッグレイアウトにいくつかのコンポーネントがあります。これらのコンポーネントは、1以上のグリッド幅とグリッド高さを持つことができます。行数はn個ですが、行ごとに最大で2つのコンポーネントしかありません。

とにかく、グリッドバッグセルがすでに占有されているかどうかを確認することはできますか。したがって、コンポーネント'A'の高さが2で、セル0x0にある場合、0x1が占有されているかどうかを確認し、そこにコンポーネントを配置することをスキップできますか?

配列について考えましたboolean[][]が、最大の行と列はレイアウトによって変わる可能性があります(ユーザーはコンポーネントを上下に移動したり、削除したり、追加したりできます)。

別の注意点として、コンポーネントは0x0-> 0x11x0->1x1として追加さ

ます

4

1 に答える 1

1

わかりましたので、これを解決することになりましArrayListBoolean[]。私の例では、列が2つしかないことを知っていました。確信が持てない場合は、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);
        }
    }

これは最適なコードではない可能性があるため、変更すべき点を見つけた場合はコメントを残してください。

于 2012-08-27T17:50:28.990 に答える