我想在GWT2.0中使用声明式方法通过MenuBar
实现菜单(MenuBar
,MenuItem
)。
我遇到了两个问题:
@UiHandler
,GWT为我编写事件处理程序的样板代码。对于菜单,我需要编写命令。我应该如何使用UiBinder方法来做到这一点呢?在.ui.xml
文件中是否有命令标记?我必须自己为命令处理程序编写样板代码吗?谢谢你思考这些问题!
发布于 2010-02-15 19:29:15
我同意,如果您尝试放入一个MenuItemSeparator
,当GWT试图创建这个小部件时,它会抱怨说只有一个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-01-21 09:13:49
对于(1) JavaDoc说:
在UiBinder模板中使用UiBinder模板文件中的MenuBar元素可以具有垂直布尔属性(默认为false),并且可能只有作为子元素的MenuItem元素。MenuItems可能包含MenuBars和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元素作为子元素”中得到提示,我猜MenuItemSeparator不受支持。
发布于 2012-03-29 20:55:16
下面是我解决这个问题的一个例子,它在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");
}
});
总的来说还不算太糟。
https://stackoverflow.com/questions/2107740
复制相似问题