2010-10-15 3 views
5

Я пытаюсь передать EventBus моего приложения в виджет, объявленный в UiBinder через его конструктор. Я использую аннотацию @UiConstructor для обозначения конструктора, который принимает EventBus, но я не знаю, как на самом деле ссылаться на объект из моего кода ui.xml.Передача объекта конструктору виджета, определенного в uibinder

То есть, мне нужно что-то вроде

WidgetThatNeedsAnEventBus.java

public class WidgetThatNeedsAnEventBus extends Composite 
{ 
    private EventBus eventBus; 

    @UiConstructor 
    public WidgetThatNeedsAnEventBus(EventBus eventBus) 
    { 
     this.eventBus = eventBus; 
    } 
} 

TheUiBinderThatWillDeclareAWTNAEB.ui.xml

<g:HTMLPanel> 
    <c:WidgetThatNeedsAnEventBus eventBus=_I_need_some_way_to_specify_my_apps_event_bus_ /> 
</g:HTMLPanel> 

У меня нет никаких проблем, проходящих статического значение WidgetThatNeedsAnEventBus, и я могу использовать фабричный метод для создания нового объекта EventBus. Но мне нужно передать уже существующий EventBus моего приложения.

Есть ли способ ссылаться на уже существующие объекты в UiBinder?

ответ

8

Моим возможным решением было использовать @UiField(provided=true) на виджетах, которые мне нужно было инициализировать переменной.

Затем я только что создал виджет на Java, прежде чем позвонить initWidget на родителя.

Например:

public class ParentWidget extends Composite 
{ 
    @UiField(provided=true) 
    protected ChildWidget child; 

    public ParentWidget(Object theObjectIWantToPass) 
    { 
     child = new ChildWidget(theObjectIWantToPass); //_before_ initWidget 
     initWidget(uiBinder.create(this)); 

     //proceed with normal initialization! 
    } 
} 
2

Я предлагаю вам использовать заводской метод (описанный here). Таким образом вы можете передать экземпляр вашему виджету.

С элементом <ui:with> вы также можете передавать объекты в виде виджетов (при условии, что существует метод сеттера) (как указано в документе here). Но объект будет создан через GWT.create, который, я думаю, не был вами, вы собираетесь делать с eventBus.

+0

также является хорошим примером для фабричных методов: http://blog.jeffdouglas.com/2010/02/24/gwt-uibinder-passing-objects-to-widgets/ – z00bs

+0

Я не хочу создавать экземпляр нового объекта, поскольку это похоже на фабричный метод. Вот другой пример: допустим, у меня есть строка, называемая myString, и в файле ui.xml у меня есть объявленный . Как я могу указать этому , что он должен использовать конструктор Label (String) и передать значение myString этому конструктору? @UiField (при условии = true) выглядит многообещающим, но я не вижу, как передать myString в конструктор. Возможно, это невозможно с UiBinder? –

+2

Передача строки: создать и аннотировать конструктор вашего класса ui с помощью 'UiConstructor' и в файле ui.xml определить атрибут с тем же именем, что и аргумент конструкторов. 'public @UiConstructor MyWidget (String myString)' и ''. – z00bs

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