Я хотел бы реализовать меню (MenuBar
, MenuItem
) использование декларативного подхода через UiBinder в GWT 2.0.
Я столкнулся с двумя проблемами:
Существует ли способ добавить MenuItemSeparators в файле .ui.xml? До сих пор мне только удалось поместить MenuBar - и Теги пункта меню в файл.
Используя @UiHandler
, GWT пишет шаблонный код для обработчиков событий для меня. Для меню я должен записать команды. Как я, как предполагается, делаю это использование подхода UiBinder? Есть ли тег команды, чтобы вставить .ui.xml
файл? Я должен написать шаблонный код для обработчиков команд сам?
Спасибо за размышление об этих вопросах!
Я согласен, если вы попытаетесь вставить MenuItemSeparator
, он будет жаловаться, что только MenuItem
может быть дочерним, когда GWT пытается создать виджет. Поскольку в настоящее время это не поддерживается, я предлагаю вам запросить это в качестве будущего улучшения для команды GWT.
Тем временем вы можете программно добавить разделитель и добавить команду следующим образом: XML-файл:
<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder" xmlns:g="urn:import:com.google.gwt.user.client.ui">
<g:HTMLPanel>
<g:MenuBar ui:field="menuBar">
<g:MenuItem ui:field="helpMenuItem">Help</g:MenuItem>
<g:MenuItem ui:field="aboutMenuItem">About</g:MenuItem>
<g:MenuItem ui:field="siteMapMenuItem">Site Map</g:MenuItem>
</g:MenuBar>
</g:HTMLPanel>
Java-файл (-ы):
public class Menu extends Composite {
...
@UiField MenuBar menuBar;
@UiField MenuItem helpMenuItem;
...
public Menu() {
initWidget(uiBinder.createAndBindUi(this));
// insert a separator
menuBar.insertSeparator(1);
// attach commands to a menu item
helpMenuItem.setCommand(new MenuCommand(HistoryToken.Help));
...
}
public class MenuCommand implements Command {
final HistoryToken historyToken;
public MenuCommand(HistoryToken historyToken) {
this.historyToken = historyToken;
}
@Override
public void execute() {
historyToken.fire();
}
}
public enum HistoryToken {
Help,About,SiteMap;
public void fire(){
History.newItem(this.toString());
}
}
В другом месте моего кода я реализован HistoryListener
для отслеживания любых изменений, т.е.
class HistoryManager implements ValueChangeHandler<String> {
// 1. get token
// 2. change it into a HistoryToken
// 3. perform switch statement
// 4. change contents based upon HistoryToken found
...
}
для (1) Javadoc говорит:
Использование в шаблонах Uibinder Элементы меню в файлах шаблонов UIBIBIDER могут иметь вертикальный логический атрибут (который по умолчанию для false), и может иметь только элементы меню в качестве детей. Menuitems могут содержать HTML и меню.
Например:
<g:MenuBar>
<g:MenuItem>Higgledy
<g:MenuBar vertical="true">
<g:MenuItem>able</g:MenuItem>
<g:MenuItem>baker</g:MenuItem>
<g:MenuItem>charlie</g:MenuItem>
</g:MenuBar>
</g:MenuItem>
<g:MenuItem>Piggledy
<g:MenuBar vertical="true">
<g:MenuItem>foo</g:MenuItem>
<g:MenuItem>bar</g:MenuItem>
<g:MenuItem>baz</g:MenuItem>
</g:MenuBar>
</g:MenuItem>
<g:MenuItem><b>Pop!</b>
<g:MenuBar vertical="true">
<g:MenuItem>uno</g:MenuItem>
<g:MenuItem>dos</g:MenuItem>
<g:MenuItem>tres</g:MenuItem>
</g:MenuBar>
</g:MenuItem>
</g:MenuBar>
Принимая подсказку из слов « только элементы Menuitem, как дети », я предполагаю, что MenueMSeemparator S не поддерживается