GWT: перезагрузка одной вкладки на панели вкладок

У меня есть панель вкладок GWT, и я хотел бы перезагрузить одну вкладку, когда определенное событие (например, нажатие кнопки) происходит на другой вкладке. Есть ли способ сделать это? Другой возможностью может быть выполнение некоторого кода (например, добавление нового элемента на вкладку), когда эта вкладка выбрана. Любая помощь будет очень признательна, я уже застрял с этим некоторое время.

Чтобы сделать вопрос более конкретным, я предоставляю код ниже.

Мой код организован на экранах, есть домашний экран, который запускает панель вкладок. И есть отдельные экраны для запуска каждой вкладки.

Упрощенный код для домашнего экрана:

    public class HomeScreen extends Composite{

  public HomeScreen()    {

    TabPanel tabPanel = new TabPanel();
    FlowPanel flowpanel;

    flowpanel = new FlowPanel();
    ProfileTabScreen profileTabScreen = new ProfileTabScreen();
    flowpanel.add(profileTabScreen);
    tabPanel.add(flowpanel, "Profile");

    flowpanel = new FlowPanel();
    GroupsTabScreen groupsTabScreen = new GroupsTabScreen();
    flowpanel.add(groupsTabScreen);
    tabPanel.add(flowpanel, "Groups");

    initWidget(tabPanel);
  }
    }

Код для экрана вкладки, с которого я хочу инициировать перезагрузку:

    private VerticalPanel groupPanel = new VerticalPanel();
private Button newGroupButton = new Button("New group");

    public GroupsTabScreen()    {       

    newGroupButton.addClickHandler(new ClickHandler(){
        public void onClick(ClickEvent event) { 
            createNewGroup();
        }
    });

            groupPanel.add(newGroupButton);

    initWidget(groupPanel);
}

Код для экрана вкладки, который необходимо перезагрузить:

    private VerticalPanel profilePanel = new VerticalPanel();
private Label label = new Label("No groups yet.");

    public ProfileTabScreen()    {      

            profilePanel.add(label);
    initWidget(profilePanel);
}

Итак, давайте представим, что я просто хочу изменить текст метки в profileTab (хотя на самом деле это будет ListBox и другие элементы), когда нажимается newGroupButton в groupTab.

Как я уже сказал, перезагрузка всего профиляTab каждый раз, когда он выбран, также будет приемлемой.


person april    schedule 06.06.2012    source источник


Ответы (2)


Грязным ответом было бы создать метку, которую вы хотите обновить, на главном экране и передать ее на обе вкладки, например:

public class HomeScreen extends Composite {
    public HomeScreen()    {
        TabPanel tabPanel = new TabPanel();
        FlowPanel flowpanel;
        Label labelToUpdate = new Label("No Groups yet");

        flowpanel = new FlowPanel();
        ProfileTabScreen profileTabScreen = new ProfileTabScreen(labelToUpdate);
        flowpanel.add(profileTabScreen);
        tabPanel.add(flowpanel, "Profile");

        flowpanel = new FlowPanel();
        GroupsTabScreen groupsTabScreen = new GroupsTabScreen(labelToUpdate);
        flowpanel.add(groupsTabScreen);
        tabPanel.add(flowpanel, "Groups");

        initWidget(tabPanel);
    }
}

public class GroupsTabScreen {
    private VerticalPanel groupPanel = new VerticalPanel();
    private Button newGroupButton = new Button("New group");
    private final Label labelToUpdate;

    public GroupsTabScreen(Label label)    {
         this.labelToUpdate = label;       

         newGroupButton.addClickHandler(new ClickHandler(){
              public void onClick(ClickEvent event) { 
                  createNewGroup();
                  labelToUpdate.setText("A group has been created");
              }
         });

        groupPanel.add(newGroupButton);

        initWidget(groupPanel);
     }
}

 public class ProfileTabScreen {
     private VerticalPanel profilePanel = new VerticalPanel();
     private final Label labelToUpdate;

     public ProfileTabScreen(Label label)    {      
        this.labelToUpdate = label;
        profilePanel.add(labelToUpdate);
        initWidget(profilePanel);
     }
 }

Более красивым решением было бы использовать шину событий между вашими классами, чтобы запускать и обнаруживать изменения событий. См. Как использовать GWT EventBus.

person jonasr    schedule 06.06.2012
comment
спасибо, Джонас, я думаю, что шина событий может быть решением и этой проблемы! - person april; 07.06.2012

Для нажатия кнопки вы можете использовать мышь или прослушиватель клавиш. Добавьте такой слушатель на панель вкладок и пусть он вызывает функцию, назовем ее «перестроить».

Функция перестроения должна иметь доступ к элементам на вкладке, которую вы хотите обновить, и пересчитать значения.

Спасибо за пример кода. Если домашний экран имеет собственный класс, вы должны определить используемые им элементы еще до его инициализации. Просто быстрый пример:

public class HomeScreen extends Composite{

    private TabPanel tabPanel;
    private FlowPanel profileTabScreenPanel;
    private FlowPanel groupsTabScreenPanel;

    public HomeScreen()    {         

        tabPanel = new TabPanel();

        profileTabScreenPanel = new FlowPanel();
        ProfileTabScreen profileTabScreen = new ProfileTabScreen();
        profileTabScreenPanel.add(profileTabScreen);
        tabPanel.add(flowpanel, "Profile");

        groupsTabScreenPanel = new FlowPanel();
        GroupsTabScreen groupsTabScreen = new GroupsTabScreen();
        groupsTabScreenPanel.add(groupsTabScreen);
        tabPanel.add(flowpanel, "Groups");

        initWidget(tabPanel);
    }
}

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

Также вы должны добавить геттеры и сеттеры в свои TabsScreen-Elements, чтобы вы, например, не могли получить доступ к ярлыку.

Например, вы можете сделать это в своей функции createNewGroup(), а затем:

profileTabScreenPanel.getLabel().setText("New Text");
person Corsair    schedule 06.06.2012
comment
Я не уверен, как добавить прослушиватель кликов на панель вкладок и как получить доступ к элементам вкладок с панели вкладок. Чтобы сделать мой вопрос более конкретным, я добавил упрощенный код своей программы. - person april; 06.06.2012
comment
Спасибо за ответ. Идея определять элементы перед их использованием и использовать геттеры и сеттеры была очень полезной. Но я не смог заставить его работать с предложенным вами примером: profileTabScreenPanel.getLabel().setText(New Text); С другой стороны, это работало с этим: HomeScreen.getProfileTabScreen().getLabel().setText(некоторый текст); Я добавил два метода получения: один в классе HomeScreen и один в классе ProfileTabScreen. - person april; 07.06.2012
comment
Мое единственное сомнение заключается в том, является ли это хорошей практикой, чтобы сделать это таким образом. Тем более, что теперь переменная profileTabScreen должна быть статической, а у меня есть статический метод: public static HomeTabScreen getHomeTabScreen() { return homeTabScreen; } - person april; 08.06.2012
comment
Каждая переменная, которую вы используете в статической функции, также должна быть статической. Вопрос в том, нужен ли вам статический метод getHomeTabScreen()? Также учтите, что вы можете создавать новые экземпляры объектов в статическом методе и возвращать их вызывающей стороне. - person Corsair; 11.06.2012