我想在GWT 2.0中通过UiBinder使用声明方法实现菜单(MenuBar
,MenuItem
)。
我遇到了两个问题:
有没有办法在.ui.xml文件中添加MenuItemSeparators?所以 到目前为止,我只设法将MenuBar-和MenuItem-tags放入 文件
使用@UiHandler
,GWT为事件编写样板代码
处理程序对我来说。对于菜单,我需要编写命令。我怎么样
应该使用UiBinder方法做到这一点?有命令吗?
要放入.ui.xml
文件的标记?我是否必须编写样板文件
我自己的命令处理程序的代码?
感谢您考虑这些问题!
答案 0 :(得分:7)
我同意,如果你试图放入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
...
}
答案 1 :(得分: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>
从单词“ only MenuItem elements as children ”中提示,我的猜测是不支持MenuItemSeparator
答案 2 :(得分:2)
以下是我对此解决方案的一个示例,它似乎与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");
}
});
总的来说还不错。
答案 3 :(得分:1)
我知道这个问题是旧的,但我在谷歌搜索中一直在运行这个问题,所以我认为重要的是要注意虽然我还没有看到它在任何地方记录,我一直在使用:
&LT; G:MenuItemSeparator /&GT;
在我的uibinder模板中成功完成。 gwt eclipse插件给了我一个红色错误标记,但MenuItemSeparator编译并显示确定。我正在使用gwt 2.1。
只是觉得有人可能有兴趣知道。
不幸的是我还没有看到#2的解决方案 - 但我希望他们能尽快给我们一些东西。
答案 4 :(得分:0)
可以在ui.xml
文件中添加menuItemSeparator。以下是official GWT-API page的分隔符和子菜单的示例。
答案 5 :(得分: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>
就这么简单。这会在菜单项之间添加一个分隔符。
干杯!