1

私は

Composite descComp

いくつかのものが含まれています...基本的には、フォームのコンテナであり、多数のラベル、コンボ、ボタンで構成され、すべて一列に並んでいます。私のフォームは有限ではありません。追加の入力用に1行追加するボタンがあります。しかし、それが機能するためには、descCompの古い子供を処分する必要があります...

private void populateConstantMain(ContentData tariffConstantsOfType, Composite descComp,GridLayout descCompLayout, Boolean resize) {

    int arraySize;

    if (resize == false) {
        arraySize = tariffConstantsOfType.getQueryRowCount();
    } else {
        for (int i = 0 ; i < descComp.getChildren().length; i++) {
            System.out.println("Disposing: " + i + " " + descComp.getChildren()[i].toString());
            //descComp.getChildren()[i].setEnabled(false);
            descComp.getChildren()[i].dispose();
        }
        arraySize = tariffConstantsOfType.getQueryRowCount() + 1;
    }
......
}

何らかの理由で

descComp.getChildren()[i].dispose();

動作しません。つまり、すべての子が破棄されないため、新しい子の挿入でエラーが発生し、レイアウトが台無しになります:/興味深いのは

descComp.getChildren()[i].setEnabled(false);

私がそれをやめたとき、すべての子供たちのために働く...

4

2 に答える 2

15

コンポジットでgetChildren()を呼び出すと、呼び出した時点で破棄されていない子のみが返されるという予感があります。descComp.getChildren()[i].dispose();したがって、インデックスが増加しているが配列のサイズが減少しているため、呼び出しはすべて混乱しています。試してみませんか:

    for (Control control : descComp.getChildren()) {
        control.dispose();
    }

このようにして、各子の破棄を開始する前に、コンポジット内の子の静的ビューを取得します。

また、コードを切り替えて、より優れたJ5for-each構文を使用しました。J1.4で立ち往生している場合は、残念ながら、for(;;)ループに固執する必要があります。

    Control[] children = descComp.getChildren();
    for (int i = 0 ; i < children.length; i++) {
        children[i].dispose();
    }
于 2012-05-25T23:56:07.813 に答える
2

子 (または配列内のもの) を破棄するときは、for next ループを使用しますが、最初から最後ではなく、最初から最後まで処理します。(そして、ループの前に長さを取得するか、変更します。)

int i = length-1;i>=0;i--

そうしないと、1 つおきに削除されます。

于 2012-08-02T18:41:46.480 に答える