GWT: Меню в UiBinder

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

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

  1. Есть ли способ добавить MenuItemSeparators в файл .ui.xml? Пока мне удалось поместить в файл только теги MenuBar- и MenuItem.

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

Спасибо, что задумались над этими вопросами!


person Marc    schedule 21.01.2010    source источник


Ответы (6)


Я согласен, если вы попытаетесь вставить 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
...
}  
person Nick    schedule 15.02.2010

Для (1) JavaDoc говорит:

Использование в шаблонах UiBinder Элементы MenuBar в файлах шаблонов UiBinder могут иметь вертикальный логический атрибут (по умолчанию false) и могут иметь только элементы MenuItem в качестве дочерних. MenuItems может содержать HTML и MenuBars.

Например:

 <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 в качестве дочерних», я предполагаю, что MenuItemSeparator не поддерживаются

person Tahir Akhtar    schedule 21.01.2010
comment
Мне было интересно, потому что плагин Eclipse, кажется, распознает ‹g: MenuItemSeparator› ... - person Marc; 23.01.2010

Вот пример моего решения, которое, кажется, очень хорошо работает с GWT 2.4.0.

UiBinder:

<g:MenuBar vertical='true' ui:field='mainMenu'>
    <g:MenuItem ui:field='item1'>Item 1</g:MenuItem>
    <g:MenuItem ui:field='item2'>Item 2</g:MenuItem>
    <g:MenuItemSeparator />
    <g:MenuItem ui:field='sub' enabled='false'>
        Submenu
        <g:MenuBar vertical='true' ui:field='subMenu' />
    </g:MenuItem>
</g:MenuBar>

Ява:

@UiField MenuItem item1;
@UiField MenuItem item2;
@UiField MenuBar subMenu;
@UiField MenuItem sub;

...

this.setWidget(uiBinder.createAndBindUi(this));
item1.setCommand(new Command() {
    public void execute() {
        History.newItem("item1");
    }
});

В целом не так уж и плохо.

person Andrew Boardman    schedule 29.03.2012

Я знаю, что этот вопрос СТАРЫЙ, но я продолжаю сталкиваться с этим вопросом в своих поисках в Google, поэтому я подумал, что было бы важно отметить, что, хотя я еще не видел, чтобы он нигде задокументирован, я использовал:

‹G: MenuItemSeparator /›

успешно в моем шаблоне uibinder. Плагин gwt eclipse выдает красный маркер ошибки, но MenuItemSeparator компилируется и отображается нормально. Я использую gwt 2.1.

Просто подумал, что кому-то будет интересно узнать.

К сожалению, я еще не видел решения для №2, но я надеюсь, что они нам что-то скоро дадут.

person Samurai Soul    schedule 17.08.2011

Можно добавить menuItemSeparator в ui.xml файл. Вот пример с разделителем и подменю из официальная страница GWT-API.

person guest    schedule 13.03.2012
comment
где это находится? Эта ссылка не дает ответа. - person yeaaaahhhh..hamf hamf; 21.02.2014

Думаю, я нашел способ реализовать это. (Это решение, если вы хотите объявить разделитель внутри файла * .ui.xml.)

HocusView.java

...
    @UiField MenuBar  menuBar;
    @UiField MenuItem item1;
    @UiField MenuItem item2; 
    @UiField MenuItem item3; 
    @UiField MenuItem item4;   
...

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

    @UiTemplate("Hocus.ui.xml")
    interface HocusViewUiBinder extends UiBinder<Widget, HocusView>{}

    public HocusView() 
    {
        initWidget(uiBinder.createAndBindUi(this));   
         // Attach commands to menu items
        menuItem1.setScheduledCommand(cmd_menuItem1);
        menuItem2.setScheduledCommand(cmd_menuItem2);
        menuItem3.setScheduledCommand(cmd_menuItem3);
        menuItem4.setScheduledCommand(cmd_menuItem4); 

    }


    Command cmd_menuItem1= new Command(){ 
    @Override
    public void execute() { 
        Window.alert("  Gifts  ");
        }
    };
    Command cmd_menuItem2 = new Command(){ 
        @Override
        public void execute() { 
            Window.alert("  Gifts  ");
        }
    };
    Command cmd_menuItem3 = new Command(){ 
        @Override
        public void execute() { 
            Window.alert("  Gifts  ");
        }
    };  
    Command cmd_menuItem4 = new Command(){ 
        @Override
        public void execute() { 
            Window.alert("  Gifts  ");
        }
    };



    });

HocusView.ui.xml

  <gwt:MenuBar ui:field="menuBar" >  
    <gwt:MenuItem ui:field="menuItem1">Search</gwt:MenuItem> 
     <gwt:MenuItemSeparator></gwt:MenuItemSeparator>
    <gwt:MenuItem ui:field="menuItem2">Ingestion</gwt:MenuItem> 
     <gwt:MenuItemSeparator></gwt:MenuItemSeparator>
    <gwt:MenuItem ui:field="menuItem3">Analysis</gwt:MenuItem> 
     <gwt:MenuItemSeparator></gwt:MenuItemSeparator>
    <gwt:MenuItem ui:field="menuItem4">About</gwt:MenuItem> 
  </gwt:MenuBar>  

Это так просто. Это добавит разделитель между пунктами меню.

Ваше здоровье!

person yeaaaahhhh..hamf hamf    schedule 21.02.2014