почему я не могу скрыть DialogBox в UiBinder в GWT?

in Test.ui.xml

<g:DialogBox ui:field="wishlistDialogBox" autoHide="true">
     <g:caption>Test</g:caption>
     <g:HTMLPanel> some widgets..</g:HTMLPanel>
</g:DialogBox>

После запуска приложение по-прежнему показывает DialogBox, поэтому я попытался установить скрытие для «wishlistDialogBox» в TestView.java, но это не сработало.

  @UiField DialogBox wishlistDialogBox;
  @Inject
  public TestView(final Binder binder) {
        widget = binder.createAndBindUi(this);
        wishlistDialogBox.hide();
   }

Затем я установил скрытие для него в TestPresenter.java, но это все равно не сработало.

  @Override
  protected void onBind() {
      super.onBind();
      getView().getWishlistDialogBox().hide();
  }

В чем дело, Гудл так и не объяснил.

Кроме того, как повторно использовать DialogBox?


person Kiti    schedule 29.09.2013    source источник


Ответы (3)


DialogBox (и вообще PopupPanels) не работает как любой другой виджет, когда речь идет о добавлении их в DOM. Вы никогда не должны прикреплять их непосредственно к нему (т. е. panel.add(yourDialogBox) или внутри UiBinder XML-файла), как вы это сделали. Вместо этого вы должны создать их и просто вызвать hide()/show() и подобные методы, чтобы отобразить/скрыть их (т.е. присоединить/отсоединить в конце/от DOM).

person Andrea Boscolo    schedule 29.09.2013

Что-то, что работает для меня, — это создание диалогового окна отдельно от любых других виджетов. Итак, у него есть собственный файл Java и собственный файл ui.xml:

XML-файл UiBinder:

<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder"
  xmlns:g="urn:import:com.google.gwt.user.client.ui">

  <g:DialogBox ui:field="dialog">
    <g:caption>My Dialog</g:caption>
    <g:HTMLPanel> 
      <g:Button ui:field="closeButton" text="close" /> 
    </g:HTMLPanel> 
  </g:DialogBox>

</ui:UiBinder> 

Java-файл:

public class MyDialog { // here you do not inherit anything

    private static MyDialogUiBinder uiBinder = GWT.create(MyDialogUiBinder.class);

    interface MyDialogUiBinder extends UiBinder<Widget, MyDialog> {
    }

    @UiField
    DialogBox dialog;

    @UiField
    Button closeButton;

    public MyDialog() {
      // make cast to DialogBox
      dialog = (DialogBox) (uiBinder.createAndBindUi(this));
    }


    public void hide() {
      dialog.hide();
    }

    public void show() {
      dialog.center();
    }

    @UiHandler("closeButton")
    public void onClick(ClickEvent event) {
      hide();
    }

}
person fascynacja    schedule 29.09.2013
comment
Хорошо, этот диалог хорош для статического сообщения, такого как приглашение или что-то в этом роде, но что нам нужно, чтобы его настроить (например, добавить в него больше виджетов), тогда нам нужно создать новый DialogBox? - person Kiti; 30.09.2013
comment
Сначала я создал MyDialog.ui.xml и MyDialog.java, используя ваш код, и он работал нормально. Но когда я создаю второй подобный диалог WishListDialogBox.ui.xml и WishListDialogBox.java --> тогда в MyDialog.java есть некоторые ошибки, такие как диалоговое окно Field не имеет соответствующего поля в файле шаблона WishListDialogBox.ui.xml - person Kiti; 30.09.2013
comment
Но после того, как я удалил WishListDialogBox.ui.xml и WishListDialogBox.java, в MyDialog.ui.xml и MyDialog.java не было ошибок. - person Kiti; 30.09.2013
comment
Так что, если я выберу ваше решение, я не смогу создать много разных версий DialogBox? - person Kiti; 30.09.2013
comment
Ваша ошибка звучит как ошибка копирования и вставки. Вы неправильно отредактировали ui.xml (переименовав диалоговое окно ui:field=). - person fascynacja; 30.09.2013
comment
нет, если я удалил WishListDialogBox.ui.xml и WishListDialogBox.java, то ошибки не будет - person Kiti; 30.09.2013
comment
кажется, что Gwt позволяет вам создать только 1 MyDialog, как ваш код, если вы попытаетесь создать второй, у них возникнет конфликт? ты так думаешь? - person Kiti; 30.09.2013
comment
Ваш код в порядке, работает нормально, но если вы создадите второй аналогичный дислогбокс (например, WishListDialogBox.ui.xml и WishListDialogBox.java), то возникнет ошибка - person Kiti; 30.09.2013
comment
я нашел решение, stackoverflow. com/questions/5471146/ это правильно - person Kiti; 30.09.2013
comment
см. предыдущий ответ. Вы никогда не должны прикреплять диалоговое окно к XML-файлу UiBinder), поэтому я думаю, что ваше решение не на 100% оптимально. - person Kiti; 30.09.2013
comment
@ Кити, ты неправильно понял ответ, о котором ты упоминаешь. Вы можете использовать DialogBox через UIBinder, но вам НЕ следует присоединять его к HTMPLPanel или любому другому контейнеру, а использовать его отдельно. И, конечно же, вы можете сделать его настраиваемым, как любую другую панель и любой другой DialogBox, который вы создаете обычным способом, кодируя структуру на Java. UIbinder как раз то, что помогает вам создавать структуру ваших виджетов - так она выглядит более понятной и html'ой. - person fascynacja; 01.10.2013

Наконец, я нашел способ поместить DialogBox в невидимый HTMLPanel.

<g:HTMLPanel visible="false"> 
    <g:DialogBox ui:field="wishlistDialogBox" autoHide="true">
        <g:caption>Test</g:caption>
        <g:HTMLPanel> some widgets..</g:HTMLPanel>
    </g:DialogBox>
</g:HTMLPanel>

Затем просто вызовите show & hide DialogBox как обычно, и он покажет DialogBox, даже если DialogBox был обернут внутри невидимого HTMLPanel.

getView().getWishlistDialogBox().show();
person Kiti    schedule 29.09.2013
comment
Это не то, как DialogBox предполагается использовать. Вам нужно сделать это, как говорит @Andrea Boscolo. - person enrybo; 29.09.2013