2014-04-04 5 views
0

GWT 페이지 또는 패널에 포함 된 모든 위젯을 읽을 수있는 프로그래밍 방식이 있습니까?GWT에서 페이지/패널의 모든 위젯 나열

"ErrorLabel"이라는 접미어가 붙은 여러 가지 오류 레이블이 있는데 그 중 하나를 찾아서 지우고 싶습니다. 나는 그들 목록을 할 수 있지만, 내가 실제로 어떤 것을 가지고 있다면 그것을 자동화 할 수 있다고 생각했다 ...

나는 UiBinder를 사용하고있다.

+0

어떤 종류의 '패널'을 사용하는지에 따라 다릅니다. 'ComplexPanel'과 하위 클래스에는 [getChildren()] (http://www.gwtproject.org/javadoc/latest/com/google/gwt/user/client/ui/ComplexPanel.html#getChildren()) 메소드가 있습니다. 'Iterator'를 리턴합니다. 재귀 논리를 구현해야합니다. 모든 자식을 반환하는 내장 함수가 있다고 생각하지 마십시오 (아마도 '요소'수준에 있을까요?). – Baz

+0

나는 DOM이나 HTML 레벨로가는 것을 피하고 싶다. 만약 내가 할 수 있다면 : – jgp

+0

'Iterator' 때문에'VerticalPanel'에 확장 된'for' 루프를 간단하게 사용할 수있다. . 참조를 위해 [this] (http://stackoverflow.com/a/7456674/1740724)를보십시오. 이 재귀 = 승리 – Baz

답변

2

recursion 메서드를 사용하면 모든 구성 요소의 하위를 가져올 수 있습니다.

단계

는 다음과 같이하십시오 (?를 UiField 이름을 읽는 방법)

  • 당신이 gwt.xml에서 항목 아래에있는 추가

    <inherits name="com.google.gwt.user.Debug"/> 
    
  • ui:field 등과 함께
  • 사용 debugId 아래에서 귀하의 ui.xml

  • 이제 이드를 아래 그림과 같이 ID를 기본 접두사 gwt-debug- 생성되는 모든

    myCheckBox.getElement().getId(); 
    
  • 을 얻을 수 있습니다. 원하는 경우 제거 할 수 있습니다.

    주 : 귀하의 요구 사항에 따라 더 많은 위젯과 구성 요소를 추가 여기

    gwt-debug-myCheckBox  
    

는 유틸리티 클래스입니다. 당신이 필요로하는 경우,

.hide .errorLabel {display: none} 

다음 : "errorLabel"예를 들어, 당신의 CSS 파일에 다음 줄을 추가 -

import java.util.Iterator; 

import com.google.gwt.user.client.ui.FlexTable; 
import com.google.gwt.user.client.ui.Panel; 
import com.google.gwt.user.client.ui.Widget; 

public class WidgetValidator { 

    private static void validateFlexTable(final FlexTable flextable) { 
     for (int row = 0; row < flextable.getRowCount(); row++) { 
      for (int column = 0; column < flextable.getCellCount(row); column++) { 
       WidgetValidator.validateWidget(flextable.getWidget(row, column)); 
      } 
     } 
    } 

    private static void validatePanel(final Panel panel) { 
     final Iterator<Widget> iterator = panel.iterator(); 
     while (iterator.hasNext()) { 
      WidgetValidator.validateWidget(iterator.next()); 
     } 
    } 

    public static void validateWidget(final Widget widget) { 
     if (widget != null) { 
      if (widget instanceof FlexTable) { 
       WidgetValidator.validateFlexTable((FlexTable) widget); 
      } else if (widget instanceof Panel) { 
       WidgetValidator.validatePanel((Panel) widget); 
      } else { 
       System.out.println(widget.getElement().getId().replace("gwt-debug-", "")); 
      } 
     } 
    } 

} 
+0

내 재귀에서 일부 유형을 잊어 버린 덕분에 도움이됩니다.그러나, 당신은 여전히 ​​UiField 이름을 얻지 못합니다 : ( – jgp

+0

처음 시작되었습니다. 이제 새로운 기능을 추가합니다. 방금 모든 아이들을 반복 할 수있는 방법을주었습니다. – Braj

+0

나는 가지고 있습니다. – Braj

1

가장 간단한 해결책은 모든 라벨에 클래스 이름을 추가하는 것입니다 이 레이블들을 숨기거나 표시하려면 다음 코드를 사용하십시오 :

parentPanel.addStyleName("hide"); 
parentPanel.removeStyleName("hide"); 
+0

'getId()'는 나에게 빈 문자열을 반환합니다 :(... – jgp

+0

) 질문에 오해가 있습니다 .Ui : 필드에 액세스 할 수 없습니다. 위젯, 그것을 선언하는 것 외 :'@UiField Label errorLabel'. –

+0

업데이트 된 솔루션보기. –