getSelectedItem () на GWT MenuBar - PullRequest
       26

getSelectedItem () на GWT MenuBar

0 голосов
/ 28 октября 2011

Я новичок в 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?
    }
}

Другие могут сказать, что это не полезный пост, но ядействительно не знаю, как это понять.Помогите мне, пожалуйста.Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 28 октября 2011

Вот версия, которая может работать для вас. Хитрость заключается в том, что конкретная команда должна быть связана с каждым элементом 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, названным для этой строки.

0 голосов
/ 28 октября 2011

Вместо того, чтобы этот класс реализовывал Command и чтобы все ваши пункты меню использовали this в качестве аргумента при добавлении с помощью .addItem(), создайте отдельный объект Command для каждого из ваших элементов меню.Затем закодируйте конкретную логику для каждого пункта меню в отдельных объектах команды.

т.е.:

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

Если вы действительно хотите обрабатывать каждый пункт меню из одного и того же фрагмента кода,Вы можете создать Фабрику, которая берет имя элемента меню и создает объект Command, который может ссылаться на него.

...