GWT: меню в UiBinder

Я хотел бы реализовать меню (MenuBar, MenuItem) использование декларативного подхода через UiBinder в GWT 2.0.

Я столкнулся с двумя проблемами:

  1. Существует ли способ добавить MenuItemSeparators в файле .ui.xml? До сих пор мне только удалось поместить MenuBar - и Теги пункта меню в файл.

  2. Используя @UiHandler, GWT пишет шаблонный код для обработчиков событий для меня. Для меню я должен записать команды. Как я, как предполагается, делаю это использование подхода UiBinder? Есть ли тег команды, чтобы вставить .ui.xml файл? Я должен написать шаблонный код для обработчиков команд сам?

Спасибо за размышление об этих вопросах!

6
задан Chris Cashwell 5 December 2011 в 22:09
поделиться

2 ответа

Я согласен, если вы попытаетесь вставить 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
...
}  
7
ответ дан 9 December 2019 в 20:43
поделиться

для (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 не поддерживается

2
ответ дан 9 December 2019 в 20:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: