Вот вывод, к которому я пришел. Может быть, это помогает кому-то еще.
Это основано на том, что порекомендовал Райли Ларк - спасибо Райли.
RegistrationPresenter здесь отвечает за процесс регистрации и показывает пользователю регистрационную форму. Сообщение об ошибке должно отображаться как можно ближе к месту, где произошла ошибка.
Без ошибок http://www.mikemitterer.at/fileadmin/stacktrace_imagehosting/screenshot-778.jpg
Произошла ошибка:
Ошибка высветилась http://www.mikemitterer.at/fileadmin/stacktrace_imagehosting/screenshot-780.jpg
Вот примерное описание того, как я реализовал это поведение:
public class RegistrationPresenter implements Presenter {
public interface Display extends StatusDisplay, HasMessageBlock {
Widget asWidget();
void setData(RegistrationTO registration);
}
private final Display display;
private final EventBus eventBus;
...
как вы можете видеть, это Display реализует HasMessageBlock:
public interface HasMessageBlock {
void showMessage(Message message);
void hideMessage();
}
Существует блок сообщений UIBinder-Widget (MessageBlock.ui.xml + MessageBlock.java)
(блок сообщений будет превращен в невидимый в своем конструкторе)
<g:HTMLPanel styleName="errorblock" ui:field="messageblock">
<div id="errorMsg" class="flurid">
<div class="row">
<div class="column width_15/16">
<h3><ui:msg key="errorblock.headline">An error occurred...</ui:msg></h3>
</div>
<div class="column orientation-right islink width_1/16">
<g:Image resource='{res.xgray}' ui:field="image" />
</div>
...
Виджет регистрации теперь включает MessageBlock
<g:HTMLPanel styleName="registration" ui:field="panel">
<div class="uniForm maxgrid700">
<h1>
<ui:msg key="registration.headline">Registration</ui:msg>
</h1>
<c:MessageBlock ui:field="messageblock"/>
<div class="ctrlHolder">
<p class="label">
<em></em>
<ui:msg key="registration.name">Name:</ui:msg>
</p>
...
Теперь, если кто-то отправляет сообщение
eventbus.fireEvent(new MessageEvent(new MessageImpl(Message.MESSAGETYPE.ERROR, "Server Error Message")));
каждый докладчик, который имеет «HasMessageBlock» для своего дисплея, может обрабатывать / отображать сообщение:
eventBus.addHandler(MessageEvent.TYPE, new MessageEventHandler() {
@Override
public void execute(final MessageEvent event) {
display.showMessage(event.getMessage());
}
});