6

我想通过 GWT 2.0 中的 UiBinder 使用声明性方法来实现菜单 ( MenuBar, )。MenuItem

我遇到了两个问题:

  1. 有没有办法在 .ui.xml 文件中添加 MenuItemSeparators?到目前为止,我只设法将 MenuBar- 和 MenuItem-tags 放入文件中。

  2. 使用@UiHandler,GWT 为我编写事件处理程序的样板代码。对于菜单,我需要编写命令。我应该如何使用 UiBinder 方法来做到这一点?文件中是否有命令标签.ui.xml?我是否必须自己为命令处理程序编写样板代码?

感谢您思考这些问题!

4

6 回答 6

7

我同意,如果您尝试放入 a ,当 GWT 尝试创建小部件时MenuItemSeparator,它会抱怨说只有 a可以是孩子。MenuItem由于目前不支持此功能,因此我建议您将其作为 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
...
}  
于 2010-02-15T19:29:15.203 回答
2

这是我对此解决方案的一个示例,它似乎与 GWT 2.4.0 配合得很好。

绑定器:

<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");
    }
});

总体来说还不错。

于 2012-03-29T20:55:16.430 回答
2

对于 (1) JavaDoc说:

在 UiBinder 模板中使用 UiBinder 模板文件中的 MenuBar 元素可以具有垂直布尔属性(默认为 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 s

于 2010-01-21T09:13:49.517 回答
1

我知道这个问题是旧的,但我一直在我的谷歌搜索中遇到这个问题,所以我认为重要的是要注意虽然我还没有看到它记录在任何地方,但我一直在使用:

<g:MenuItemSeparator/>

在我的 uibinder 模板中成功。gwt eclipse 插件给了我一个红色的错误标记,但 MenuItemSeparator 编译并显示正常。我正在使用 gwt 2.1。

只是想有人可能有兴趣知道。

不幸的是,我还没有看到#2 的解决方案——但我希望他们能尽快给我们一些东西。

于 2011-08-17T20:22:19.113 回答
0

好吧,我想我找到了实现这一点的方法。(如果您想在 *.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>  

就这么简单。这将在菜单项之间添加一个分隔符。

干杯!

于 2014-02-21T14:09:03.940 回答
0

可以在ui.xml文件中添加 menuItemSeparator。这是官方 GWT-API 页面中带有分隔符和子菜单的示例。

于 2012-03-13T09:56:32.760 回答