GWT:在选项卡面板中重新加载单个选项卡
我有一个GWT选项卡面板,希望在另一个选项卡中发生特定事件(例如,按钮单击)时重新加载单个选项卡。有办法吗? 另一种可能是在选择某个选项卡时执行某些代码(例如,向该选项卡添加新元素)。 任何帮助都将不胜感激,我已经被这件事困扰了一段时间 为了使问题更加具体,我在下面提供了一些代码 我将代码组织在屏幕中,有一个主屏幕启动选项卡面板。每个选项卡的启动都有单独的屏幕 主屏幕的简化代码:GWT:在选项卡面板中重新加载单个选项卡,gwt,tabs,reload,selected,tabpanel,Gwt,Tabs,Reload,Selected,Tabpanel,我有一个GWT选项卡面板,希望在另一个选项卡中发生特定事件(例如,按钮单击)时重新加载单个选项卡。有办法吗? 另一种可能是在选择某个选项卡时执行某些代码(例如,向该选项卡添加新元素)。 任何帮助都将不胜感激,我已经被这件事困扰了一段时间 为了使问题更加具体,我在下面提供了一些代码 我将代码组织在屏幕中,有一个主屏幕启动选项卡面板。每个选项卡的启动都有单独的屏幕 主屏幕的简化代码: public class HomeScreen extends Composite{ public H
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()方法是静态的?还可以考虑在静态方法中创建对象的新实例并将它们返回给调用方。谢谢乔纳斯,我认为事件总线也可以解决这个问题!