GWT:在选项卡面板中重新加载单个选项卡

GWT:在选项卡面板中重新加载单个选项卡,gwt,tabs,reload,selected,tabpanel,Gwt,Tabs,Reload,Selected,Tabpanel,我有一个GWT选项卡面板,希望在另一个选项卡中发生特定事件(例如,按钮单击)时重新加载单个选项卡。有办法吗? 另一种可能是在选择某个选项卡时执行某些代码(例如,向该选项卡添加新元素)。 任何帮助都将不胜感激,我已经被这件事困扰了一段时间 为了使问题更加具体,我在下面提供了一些代码 我将代码组织在屏幕中,有一个主屏幕启动选项卡面板。每个选项卡的启动都有单独的屏幕 主屏幕的简化代码: public class HomeScreen extends Composite{ public H

我有一个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);
}
所以,让我们想象一下,当在groupTab中单击newGroupButton时,我只想更改profileTab中标签的文本(实际上是ListBox和其他元素)


正如我所说,每次选择时重新加载整个Profile选项卡也是可以接受的。

对于按钮单击,您可以使用鼠标或按键侦听器。将这样一个侦听器添加到选项卡面板,让它调用一个函数,让我们称之为“重建”

“重建”功能应该能够访问要更新和重新计算值的选项卡中的元素

谢谢你的代码示例。如果主屏幕有自己的类,那么在初始化它之前,应该定义它使用的元素。举个简单的例子:

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元素中添加getter和setter,这样您就可以访问标签

例如,您可以在createNewGroup()函数中执行此操作,然后:

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

肮脏的答案是在主屏幕上构建要更新的标签,并将其传递给两个选项卡,如下所示:

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

更好的解决方案是在类之间使用事件总线,触发并检测事件更改。请参见

我不确定如何将单击侦听器添加到选项卡面板,以及如何从选项卡面板访问选项卡中的元素。为了使我的问题更具体,我在我的程序中添加了一些简化的代码。谢谢你的回复。在使用元素之前定义元素以及使用getter和setter的想法非常有用。但我无法让它与您建议的示例一起工作:profileTabScreenPanel.getLabel().setText(“新文本”);另一方面,它使用的是:HomeScreen.getProfileTabScreen().getLabel().setText(“一些文本”);我已经添加了两个getter方法,一个在HomeScreen类中,一个在ProfileTabScreen类中。我唯一的疑问是这样做是否是一个好的实践。特别是现在profileTabScreen变量必须是静态的,我有一个静态方法:public static HomeTabScreen getHomeTabScreen(){return HomeTabScreen;}静态函数中使用的每个变量也必须是静态的。问题是,是否需要getHomeTabScreen()方法是静态的?还可以考虑在静态方法中创建对象的新实例并将它们返回给调用方。谢谢乔纳斯,我认为事件总线也可以解决这个问题!