首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >UiBinder中的菜单

UiBinder中的菜单
EN

Stack Overflow用户
提问于 2010-01-21 08:09:28
回答 6查看 14.3K关注 0票数 6

我想在GWT2.0中使用声明式方法通过MenuBar实现菜单(MenuBarMenuItem)。

我遇到了两个问题:

  1. 有办法在MenuItemSeparators文件中添加.ui.xml吗?到目前为止,我只设法将MenuBar和MenuItem标记放入文件中。
  2. 使用@UiHandler,GWT为我编写事件处理程序的样板代码。对于菜单,我需要编写命令。我应该如何使用UiBinder方法来做到这一点呢?在.ui.xml文件中是否有命令标记?我必须自己为命令处理程序编写样板代码吗?

谢谢你思考这些问题!

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-02-15 19:29:15

我同意,如果您尝试放入一个MenuItemSeparator,当GWT试图创建这个小部件时,它会抱怨说只有一个MenuItem可以是子部件。由于目前不支持这一点,我建议您将此请求作为GWT团队未来的增强。

同时,可以以编程方式添加分隔符,并以以下方式添加命令: XML文件:

代码语言:javascript
运行
复制
<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文件:

代码语言:javascript
运行
复制
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以捕获任何更改,即

代码语言:javascript
运行
复制
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
EN

Stack Overflow用户

发布于 2010-01-21 09:13:49

对于(1) JavaDoc说:

在UiBinder模板中使用UiBinder模板文件中的MenuBar元素可以具有垂直布尔属性(默认为false),并且可能只有作为子元素的MenuItem元素。MenuItems可能包含MenuBars和HTML。 例如:

代码语言:javascript
运行
复制
 <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不受支持。

票数 2
EN

Stack Overflow用户

发布于 2012-03-29 20:55:16

下面是我解决这个问题的一个例子,它在GWT 2.4.0中似乎运行得很好。

UiBinder:

代码语言:javascript
运行
复制
<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>

爪哇:

代码语言:javascript
运行
复制
@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");
    }
});

总的来说还不算太糟。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2107740

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档