2011-08-03 2 views
6

우리의 요구 사항은 셀에 맞춤 위젯을 포함하는 CellTable을 사용하여 편집 가능한 격자를 만드는 것입니다. 맞춤 위젯에 텍스트 상자 및 텍스트 상자와 연관된 검색 버튼이 있습니다. 맞춤 위젯을 셀로 추가하려면 AbstractEditableCell 클래스 (GWT에서 제공)의 하위 클래스를 만들고 render()onBrowserEvent() 메소드를 재정의했습니다.GWT : 셀 위젯에 맞춤 위젯을 추가 할 때 맞춤 위젯의 이벤트 손실

맞춤 위젯 셀의 메서드는 위젯의 안전 HTML을 만들어 셀에이 안전 HTML을 렌더링합니다. 하지만 내가 직면하고있는 문제는 사용자 정의 위젯이 올바르게 렌더링되지만 관련 이벤트가 손실된다는 것입니다. 의 렌더링 방법은 다음과 같다 : 나는 다음과 같은 코드를 사용하여 render() 방법에 위젯을 추가하려고하면, 그것은 위젯을 추가하지 않습니다

if (viewData.isEditing()) { 
    textBoxSelector.setText(text); 
    OnlyToBeUsedInGeneratedCodeStringBlessedAsSafeHtml safeHtmlObj = new OnlyToBeUsedInGeneratedCodeStringBlessedAsSafeHtml(textBoxSelector.toString()); 
    sb.append(safeHtmlObj); 
} else { 
    // The user pressed enter, but view data still exists. 
    sb.append(html); 
} 

.

int left = parent.getAbsoluteLeft(); 
    int top = parent.getAbsoluteTop(); 
    String elementId = "ID" + left + top; 
    try { 
     parent.setId(elementId); 
     // parent.removeFromParent(); 
     RootPanel.get(elementId).add(textBoxSelector); 
    } catch (AssertionError error) { 
     RootPanel.get(elementId).add(textBoxSelector); 
    } 

사람이 관련된 이벤트를 잃지 않고 CellTable에서 위젯의 추가를 달성 나를 인도 할 수 있다면 정말 감사하겠습니다.

답변

5

GWT의 셀은 GWT 위젯과 호환되지 않습니다. 즉, GWT 위젯을 셀 내부에 배치하여 계속 작동시킬 수는 없습니다. 셀에는 대체 이벤트 처리 메커니즘이 있습니다 (아래에서 다룹니다)

이유는 셀이 상태없는 렌더러에 더 가깝기 때문입니다. 데이터 객체가 주어지면 Cell은 HTML을 출력합니다. 단일 셀은 페이지의 다양한 요소에 대해 HTML을 반복적으로 사용하여 반복적으로 재사용되며 생성 된 DOM 요소에 대한 참조는 절대로 유지하지 않습니다.

위의 예에서 "someWidget.toString()"을 호출합니다. 이렇게하면 위젯의 HTML 표현 만 반환되며 이벤트 처리가 손실됩니다. 세포

GWT Dev Guide for Custom Cells에서

이벤트 처리 (일부 추가 정보를 가지고)

세포에서 이벤트를 처리하기 위해, 당신은 onBrowserEvent라는 별도의 메서드를 재정의해야합니다. 청취에 관심이있는 이벤트 목록을 사용하여 생성자에서 super('click', 'keydown')을 호출하여 특정 이벤트에 대해 알리도록 셀을 구성해야합니다.

셀은 상태 비 저장 렌더러이므로 onBrowserEvent에는 셀이 렌더링 한 원래 데이터 객체와 함께 클릭 한 렌더링 된 요소의 컨텍스트가 전달됩니다. 그런 다음 필요에 따라 변경 사항을 적용하거나 DOM을 조작 할 수 있습니다.

@Override 
public void onBrowserEvent(
    Context context, 
    Element parent, 
    String value, 
    NativeEvent event, 
    ValueUpdater<String> valueUpdater) { 

    // Let AbstractCell handle the keydown event. 
    super.onBrowserEvent(context, parent, value, event, valueUpdater); 

    // Handle the click event. 
    if ("click".equals(event.getType())) { 
    // Ignore clicks that occur outside of the outermost element. 
    EventTarget eventTarget = event.getEventTarget(); 
    if (parent.getFirstChildElement().isOrHasChild(Element.as(eventTarget))) { 
     doAction(value, valueUpdater); 
    } 
    } 
} 
: 여기

상기 연결된 디바이스 가이드 찍은 예는
관련 문제