2012-05-25 2 views
1

나는 기본적으로 레이블, 콤보 및 버튼, 일렬로 정렬 된 모든 숫자로 구성된 형태의 컨테이너입니다 ... 거기에 몇 가지 물건으로Composite 객체의 모든 자식을 처리하는 방법은 무엇입니까?

Composite descComp 

을 HAVA. 양식이 유한 한 것이 아니며 추가 입력을 위해 한 줄을 추가하는 버튼이 있습니다. 그러나 그 어떤 이유로

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

, 그것은 늘 모든 아이를 폐기 의미 작동 할 수없는 결과를 위해 ... 그것이 내가 내 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; 
    } 
...... 
} 

를 작동하려면 따라서 새로운 아이를 삽입 레이아웃을 망치고의 오류 :/흥미로운 점은 그 나는 모든 아이들을 위해, 그것을 uncoment

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

작품, ...

답변

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's를 재설정/repopulating. 어떤 생각? – Campa

2

(배열 또는 무엇이든) 어린이를 배치하는 나는 다음 루프의 사용하지만에 끝에서 통과 시작, 끝내기 시작하지 마라. 루프 이전이나 길이가 변경되기 전에 변경하십시오.

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

그렇지 않으면 다른 모든 것을 삭제합니다.

관련 문제