Вот версия, которая может работать для вас. Хитрость заключается в том, что конкретная команда должна быть связана с каждым элементом MenuItem, а не одна команда для всех них:
import com.google.gwt.user.client.Command;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.MenuBar;
public class Menu extends Composite {
private MenuBar menu = new MenuBar();
private MenuBar priceMgt = new MenuBar(true);
private MenuBar salesReport = new MenuBar(true);
// and a lot more menubars
private String[] itemPriceMgt = { "Manage Price List",
"Print Product Pricing", "Price Proof List" };
private String[] itemSalesReport = { "Sales Transaction List",
"Cashier Report", "Media Tender Report",
"Sales Report by Employee", "Sales Warranty Tracking",
"Sales Report by Product", "Sales Summary by Branch",
"Sales Summary by Product", "Sales Summary by Period",
"Product Movement Analysis", "Sales Comparison", "Sales Book",
"Download eSales" };
public Menu() {
loadMenu();
}
private void loadMenu() {
addSubMenuItem(priceMgt, itemPriceMgt);
addSubMenuItem(salesReport, itemSalesReport);
menu.addItem("Home", false, new Command() {
@Override
public void execute() {
// TODO execute a Home command
}
});
menu.addItem("Price Management", new Command() {
@Override
public void execute() {
// TODO execute a Price Management command
}
});
menu.addItem("Sales Report", new Command() {
@Override
public void execute() {
// TODO execute a Sales Report command
}
});
menu.addItem("Logout", false, new Command() {
@Override
public void execute() {
// TODO execute a Logout command
}
});
initWidget(menu);
}
class SubMenuItemCommand {
private String commandName = null;
public SubMenuItemCommand(String commandName) {
this.commandName = commandName;
}
public Command subMenuItemCommand = new Command() {
@Override
public void execute() {
if (commandName.equals("Manage Price List")) {
// TODO execute the Manage Price List command
} else if (commandName.equals("Print Product Pricing")) {
// TODO execute the Print Product Pricing command
}
// and so on
}
};
}
private void addSubMenuItem(MenuBar menubar, String[] list) {
for (int i = 0; i < list.length; i++) {
menubar.addItem(list[i],
new SubMenuItemCommand(list[i]).subMenuItemCommand);
}
}
}
Я переработал ваш код, чтобы использовать этот подход, но постарался максимально приблизиться к вашему первоначальному дизайну. Другие люди могут предложить просто переписать все это, но я думаю, что вы сможете лучше понять, как это работает, если мы будем пристально следить за вашим дизайном.
Уродливой частью этого дизайна является класс SubMenuItemCommand. Я создаю отдельный объект для каждого элемента подменю, и это нормально, но каждый объект предоставляет уникальную Команду с целым набором кода, который выполняет ровно один путь в нем, когда-либо. Там много потерянного байт-кода. Но, как я уже сказал, я хотел придерживаться вашего дизайна. Как только вы освоитесь с этим, вы, вероятно, перепишете его сами.
Другой подход к подменю - создать карту строк для команд, а затем вытянуть нужную команду из карты, чтобы связать ее с каждым MenuItem, названным для этой строки.