GWT 菜单栏上的 getSelectedItem()

Posted

技术标签:

【中文标题】GWT 菜单栏上的 getSelectedItem()【英文标题】:getSelectedItem() on GWT MenuBar 【发布时间】:2011-10-28 10:55:53 【问题描述】:

我是 GWT 的新手,所以请帮助我。我的GWT MenuBar 有一个关于如何getSelectedItem() 的问题。

这是我的代码:

public class Menu extends Composite implements Command 
    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, this );
        menu.addItem( "Price Management", priceMgt );
        menu.addItem( "Sales Report", salesReport );
        menu.addItem( "Logout", false, this );

        initWidget( menu );
    

    private void addSubMenuItem( MenuBar menubar, String[] list ) 
        for( int i = 0; i < list.length; i++ ) 
            menubar.addItem( list[i], this );
        
    

    public void execute() 
        // load the selected module
        // by getting the selected item
        // i can't use menu.getSelectedItem() - it's protected.
        // when i extend this class to MenuBar, adding Item says ambiguous 
        // method addItem(String,Command) for MenuBar
        // how can I get the items being selected/clicked?
    

其他人可能会说这是一个没有用的帖子,但我真的不知道如何弄清楚。请帮我。提前致谢。

【问题讨论】:

【参考方案1】:

这是一个可能适合您的版本。诀窍是每个 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 类。我为每个子菜单项创建了一个单独的对象,这很好,但是每个对象都提供了一个独特的命令,其中包含一大堆代码,它永远只执行一个路径。那里有很多浪费的字节码。但就像我说的,我想坚持你的设计。一旦你适应了它,你可能会自己重写它。

子菜单的另一种方法是创建一个字符串到命令的映射,然后从映射中提取正确的命令以关联到为该字符串命名的每个菜单项。

【讨论】:

感谢您回答这个问题。如果你不考虑我的设计就自己做,你会如何实现它?【参考方案2】:

不要让这个类实现Command 并让所有菜单项在添加.addItem() 时都使用this 作为参数,而是为每个菜单项创建一个不同的Command 对象。然后,将每个菜单项的特定逻辑编码到单独的命令对象中。

即:

 menu.addItem( "Home", false, new Command() 
      @Override
      public void execute() 
           // handle "Home" case here
      
 );

如果您真的想通过同一段代码处理每个菜单项,那么您可以创建一个工厂,它采用菜单项的名称并生成一个可以引用它的 Command 对象。

【讨论】:

以上是关于GWT 菜单栏上的 getSelectedItem()的主要内容,如果未能解决你的问题,请参考以下文章

我可以禁用菜单栏上的菜单项和/或动态显示它吗?

导航栏上的菜单项和导航栏左侧的公司图标

PADS Layout 菜单栏上的"File"图标不见了 怎么恢复啊

如何根据 yii2 中的角色更改 Admin LTE 侧边栏上的菜单?

如何在屏幕点击时删除 GWT 菜单栏?

如何单击底部栏上的图标