0

GWT タブ パネルがあり、特定のイベント (ボタン クリックなど) が別のタブで発生したときに、単一のタブをリロードしたいと考えています。それを行う方法はありますか?もう 1 つの可能性は、タブが選択されたときに何らかのコードを実行することです (タブに新しい要素を追加するなど)。どんな助けでも本当にありがたいです、私はすでにしばらくの間これにこだわっています。

質問をより具体的にするために、以下のコードを提供しています。

コードを画面に整理しました。タブ パネルを開始するホーム画面があります。また、各タブを開始するための個別の画面があります。

ホーム画面の簡略化されたコード:

    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 とその他の要素になります)。

私が言ったように、 profileTab が選択されるたびに全体をリロードすることも許容されます。

4

2 に答える 2

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

より良い解決策は、クラス間でイベントバスを使用して、イベントの変更を発生させて検出することです。GWT EventBus の使用方法を参照してください。

于 2012-06-06T10:29:51.633 に答える
0

ボタン クリックには、マウスまたはキー リスナーを使用できます。このようなリスナーをタブ パネルに追加し、関数を呼び出させます。これを「リビルド」と呼びましょう。

再構築機能は、更新したいタブの要素にアクセスして値を再計算できる必要があります。

コード例をありがとう。ホーム画面に独自のクラスがある場合は、初期化する前に、ホーム画面で使用される要素を定義する必要があります。簡単な例:

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

利点は、実装するすべての Handler が特定の要素に直接アクセスできることです。つまり、要素にアクセスしたり、要素をリセットしたりできます。

また、Getter と Setter を TabsScreen-Elements にアドバタイズして、たとえばラベルにアクセスできるようにする必要があります。

たとえば、createNewGroup() 関数でこれを行うことができます。

profileTabScreenPanel.getLabel().setText("New Text");
于 2012-06-06T09:45:35.103 に答える