2012-05-25 2 views
1

Я хавКак распоряжаться всеми дочерними элементами композитного объекта?

Composite descComp 

с некоторыми вещами в нем ... в основном это контейнер для формы, состоящее из числа меток, Комба и кнопок, располагающихся в строке. Моя форма не является конечной, у меня есть кнопка, которая добавляет одну дополнительную строку для дополнительного ввода. Однако для того, чтобы работать швы я должен располагать старые дети моего 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); 

работы, когда я uncoment его, для всех детей ...

ответ

15

У меня есть догадка о том, что вызов getChildren() на композите возвращает вам только неустановленных детей в момент его вызова. Поэтому вызов descComp.getChildren()[i].dispose(); все испорчен, так как ваш индекс увеличивается, но ваш массив уменьшается по размеру. Почему бы вам не попробовать:

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

Таким образом, вы получите статический вид детей в композите, прежде чем начать утилизацию каждого из них.

Я также переключил код, чтобы использовать более удобный J5 для каждого синтаксиса. Если вы застряли на J1.4, то, к сожалению, вам нужно придерживаться цикла for(;;):

Control[] children = descComp.getChildren(); 
    for (int i = 0 ; i < children.length; i++) { 
     children[i].dispose(); 
    } 
+3

Я голосую за этот ответ. Готов поспорить, это работает! –

+2

Удивительный! Спасибо большое ! Это работает :) – mentis

+0

Человек, я все равно получаю исключение во время выполнения: D В моем случае я перезагружаю/перезаписываю радио 'Button' в композите. Есть идеи? – Campa

2

При утилизации детей (или что-нибудь в массиве) Я использую для следующего цикла, но пройти от одного конца до начать, а не начинать с конца. (И получить длину до петли или она изменяется.)

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

в противном случае вы удаляете все остальные.

Смежные вопросы