2012-07-23 3 views
0

최근에 내 응용 프로그램 중 하나에서 GWT를 사용하기 시작했습니다. 나는 UiBinder의 사용과 관련하여 의심의 여지가있었습니다. 내 클래스에서 (그리고 마찬가지로 .ui.xml에서도) @UiField 특성을 선언했다면, 해당 형식의 새 개체를 만들고 동일한 참조에 할당 할 수 있습니까? 건설자?GWT UiBinder - UiField 참조에 새 객체 지정

예를 들어, 내 ui.xml 파일의 가운데에 PlotWidget이있는 DockLayoutPanel이있는 경우입니다.

public class PlotWidget extends Composite { 

    @UiField (provided = true) 
    SimplePlot plot; 

    public Constructor() { 
     plot = new SimplePlot(someArgument1, someArgument2); 
    } 

    // some method 
    public doSomething() { 
     // Is this valid? 
     plot = new SimplePlot(someArgument3, someArgument4);  
    } 
} 

플롯이 DockLayoutPanel에 연결되어 있는지 여부를 결정합니다. 그렇지 않다면, 위와 같이 새로운 객체를 생성해야하는 기능을 어떻게 얻을 수 있습니까?

모든 포인터가 제공됩니다.

답변

0

예 코드에서 누락 된 것은 ui binder create call입니다 (initWidget(uiBinder.createAndBindUi(this));과 같은 것). 이것은,이 경우, constructor의 UI 필드 plotContainer의 초기화 후에 불려갑니다. 새 인스턴스를 SimplePlot에 재 할당하려면 새 인스턴스가 DockLayoutPanel에 연결되지 않고 기존 인스턴스를 어떻게 든 대체 한 경우 핸들러를 다시 연결해야합니다.

해결책은 새로운 SimplePlot 인스턴스를 만들거나 대신 SimplePlot의 메서드 호출을 통해 인수를 설정할 수 있습니다. 그러나 SimplePlot을 생성하는 유일한 방법이 생성자를 통해 이루어지는 경우 구현을 제어 할 수없는 경우 SimplePlot을 만들고 SimpleLoader를 작성하고 핸들러를 연결하고 setWidget을 통해 새 위젯을 설정하는 별도의 uibinder 클래스/위젯을 만들 수 있습니다 sinicyn이 묘사하는 PlotWidget.

+0

불완전한 코드는 유감 스럽지만 원본 응용 프로그램에서'initWidget' 메서드를 사용했습니다 (전체 코드는 여기에 붙여 넣지 않았습니다). 패널에 부착되지 않았 음을 확인해 주셔서 감사합니다. 어떻게 든 gflot SimplePlot redraw가 작동하지 않아 새로운 인스턴스를 생성해야했습니다. 해결 방법으로 사용했던 것은 docklayoutpanel을 지우고 새롭게 생성 된 SimplePlot을 중앙에 'panel.add (plot)'로 설정하고 지금까지 작동했습니다. – Swapnil

1

그런 경우 위젯을 변경하기 위해 컨테이너를 사용합니다.

public class PlotWidget { 

    @UiField 
    SimplePanel plotContainer; 

    public Constructor() { 
     plotContainer.setWidget(new SimplePlot(someArgument1, someArgument2)); 
    } 

    public doSomething() { 
     plotContainer.setWidget(new SimplePlot(someArgument3, someArgument4));  
    } 
} 

그러나 플롯 필드 (@UiHandler의 annptation에서 제공) 이벤트 핸들러가있는 경우 올바르게 작동하지 않습니다.

+0

위의 코드에 문제가 있음을 의미합니까? 결국 이벤트 처리기를 통합하고 싶습니다. 그래서 이것이 도움이 될지 의심 스럽습니다. – Swapnil