TabLayoutPanel на GWT и MVP

Я начинаю разрабатывать интерфейс с GWT, используя архитектуру MVP по этой модели:

  • Первое представление, которое создает экземпляр TabLayoutPanel, определяет виджеты первой вкладки и пустую вторую вкладку.
  • onSelection второй вкладки Я запускаю событие, которое отправляет всю TabLayoutPanel во второе представление, которое будет определять виджеты второй вкладки.

Во втором представлении я получаю соответствующую TabLayoutPanel, но когда я извлекаю вторую вкладку, вношу изменения и вставляю ее в старую панель, я получаю сообщение «Родитель этого виджета не реализует HasWidgets», и вторая вкладка исчезает.

Спасибо, что помогли мне увидеть, в чем здесь настоящая проблема или как это сделать иначе.

Я добавил второй код просмотра с комментариями.

public class MDP2View extends Composite implements MDP2Presenter.Display {

    private final TabLayoutPanel tabPanel;
    private final VerticalPanel MDP2;
    private final Label label;

    public MDP2View(HasSelectionHandlers<Integer> tabPanel) {
            // Getting the TabLayoutPanel created on the first View  
        this.tabPanel = (TabLayoutPanel) tabPanel;
            // Getting the second Tab (this will remove the Tab from the TabLayoutPanel)
        MDP2 = (VerticalPanel) this.tabPanel.getWidget(1); 
        initWidget(MDP2);
            // Adding a label to the Tab
        label = new Label();
        label.setText("onSelectionHandler Works!!!");
        MDP2.add(label);
            // Inserting the Tab in the tabPanel
        this.tabPanel.insert(MDP2, "MDP2", 1);
}

person user1331120    schedule 15.05.2012    source источник


Ответы (2)


Проблема началась, когда вы добавили виджет в его конструктор к родителю. Что привело к этой ошибке в вашем коде. Сначала вы прикрепляете виджет MDP2 к новому родителю MDP2View, вызывая initWidget. MDP2View является новым родителем MDP2 (поскольку теперь он удален из tabPanel). Затем во вставке вы, вероятно, намереваетесь вставить свое представление, но вместо этого вставляете только дочерний виджет MDP2. Ошибка вызвана тем, что вставка неявно попытается удалить MDP2 из своего родителя MDP2View с помощью метода removeParent, а это не разрешено дочернему виджету MDP2View. Если я прав, это должно заставить его работать this.tabPanel.insert(this, "MDP2", 1);.

Но гораздо лучше убрать взаимодействие с tabPanel из этого конструктора и перенести его в реализацию, например, selectionHandler. Это сделает ваш взгляд намного чище. Этот код просто ждет будущих ошибок: приведение к TabLayoutPanel, приведение к VerticalPanel; что, если вы измените этот виджет, это приведет к ошибкам во время выполнения. Получение и вставка в жестко заданную позицию 1; что, если вы добавите вкладку перед 1; ваш код будет вести себя неправильно.

person Hilbrand Bouwkamp    schedule 15.05.2012
comment
В моем коде я управляю выбором в ведущем view1, поэтому я запускаю событие, которое вызовет MDP2Presenter, который вызывает MDP2View, поэтому я не вижу, как внести изменения (добавить метки и текстовые поля) в ведущем 1 - person user1331120; 16.05.2012
comment
Спасибо за вашу помощь! Я пробовал this.tabPanel.insert(this, MDP2, 1); и я не улавливаю никаких ошибок, но вкладка MDP2 все еще не отображается - person user1331120; 16.05.2012

Я думаю, вы должны создать свой объект MDP2, не получая ссылку на существующий виджет (здесь this.tabPanel.getWidget(1)). Затем вставьте новый MDP2 в tabpanel#1.

Что-то типа:

MDP2 = initWidget(new VerticalPanel()); 
// Adding a label to the Tab
label = new Label();
label.setText("onSelectionHandler Works!!!");
MDP2.add(label);
// Inserting the Tab in the tabPanel
this.tabPanel.insert(MDP2, "MDP2", 1);

Я думаю, что вызов метода «init» для чего-то, что уже существует, может быть опасным :)

person Arcadien    schedule 15.06.2012