2012-06-06 3 views
0

У меня есть панель вкладок 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 (whi в действительности это будет ListBox и другие элементы), когда newGroupButton щелкнут в groupTab.

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

ответ

0

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

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

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

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); 
    } 
} 

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

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

Например, вы могли бы сделать это в createNewGroup() - функция, то:

profileTabScreenPanel.getLabel().setText("New Text"); 
+0

Я не уверен, как добавить прослушиватель кликов на панель вкладок и как получить доступ к элементам в вкладках с панели вкладок. Чтобы уточнить мой вопрос, я добавил несколько упрощенных кодов моей программы. – april

+0

Я тоже редактировал :-) – Corsair

+0

Спасибо за ваш ответ. Идея определить элементы перед их использованием и использовать геттеры и сеттеры была очень полезной. Но я не мог заставить его работать с примером, который вы предложили: profileTabScreenPanel.getLabel(). SetText («Новый текст»); С другой стороны, он работал с этим: HomeScreen.getProfileTabScreen(). GetLabel(). SetText («некоторый текст»); Я добавил два метода getter, один в классе HomeScreen и один в классе ProfileTabScreen. – april

0

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

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); 
    } 
} 

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

+0

спасибо jonas, я думаю, что автобус может быть решением этой проблемы! – april

Смежные вопросы