2013-01-07 47 views
0

我有Back/Forward键(功能并不重要,只想让我的头周围和缩小GWT页面交换面板)GWT视图导航基本的例子

NavigationButtonsPanel

导航面板
public class NavigationButtonsPanel extends HTMLPanel 
     { 
      private Button btnA = new Button("Go back"); 
      private Button btnB = new Button("Go forward"); 

      public NavigationButtonsPanel() 
      { 
       super("Navigation Panel"); 
       add(btnA); 
       add(btnB); 
      } 

      public void setBackHandler(ClickHandler handler) 
      { 
       btnA.addClickHandler(handler); 
      } 

      public void setForwardHandler(ClickHandler handler) 
      { 
       btnB.addClickHandler(handler); 
      } 
     } 

我然后有3个基本面板,AB和C,其使用此。我从A-B-C导航回到B-A可以正常工作。他们去之前,面板B.在这种情况下PanelB一个标签 我现在模拟用户不断变化的东西。 我的最终应用程序显然会比这更复杂,但这是典型的应用程序如何工作。您可以通过同一面板或不同面板中的用户交互来修改面板中的某些字段,加载新面板,进行更多交互,加载不同面板等? 我只希望用户因此只有一个路径在一定面板使用了非常明确的导航路径。

红砂糖

public class PanelA extends HTMLPanel 
{ 
    private static PanelA panel;    
    private PanelA() 
    { 
     super("Panel A"); 
     final RootPanel rootPanel = RootPanel.get(); 

     NavigationButtonsPanel btnPanel = new NavigationButtonsPanel(); 
     btnPanel.setForwardHandler(new ClickHandler() { 
      public void onClick(ClickEvent event) 
      { 
       rootPanel.clear(); 
       PanelB.setMessageFromPreviousPage("Message set in Panel AAAAA"); 
       rootPanel.add(PanelB.getInstance()); 
      } 
     }); 

     add(btnPanel); 
    } 

    public static PanelA getInstance() 
    { 
     if (panel == null) 
     { 
      panel = new PanelA(); 
     } 
     return panel; 
    } 
} 

PanelB

public class PanelB extends HTMLPanel 
{ 
    private static PanelB panel; 
    private static String messageFromPreviousPage; 

    private PanelB() 
    { 
     super("Panel B"); 
     final RootPanel rootPanel = RootPanel.get(); 

     Label messageLabel = new Label(messageFromPreviousPage); 


     NavigationButtonsPanel btnPanel = new NavigationButtonsPanel(); 
     btnPanel.setBackHandler(new ClickHandler() { 
      public void onClick(ClickEvent event) 
      { 
       rootPanel.clear(); 
       rootPanel.add(PanelA.getInstance()); 
      } 
     }); 

     btnPanel.setForwardHandler(new ClickHandler() { 
      public void onClick(ClickEvent event) 
      { 
       rootPanel.clear(); 
       rootPanel.add(PanelC.getInstance()); 
      } 
     }); 

     add(btnPanel); 
     add(messageLabel); 
    } 

    public static PanelB getInstance() 
    { 
     if (panel == null) 
     { 
      panel = new PanelB(); 
     } 
     return panel; 
    } 

    public static void setMessageFromPreviousPage(
      String message) 
    { 
     messageFromPreviousPage = message; 


} 
    } 

PanelC

public class PanelC extends HTMLPanel 
     { 
      private static PanelC panel;    
      private PanelC() 
      { 
       super("Panel C"); 
       final RootPanel rootPanel = RootPanel.get(); 

       NavigationButtonsPanel btnPanel = new NavigationButtonsPanel(); 
       btnPanel.setBackHandler(new ClickHandler() { 
        public void onClick(ClickEvent event) 
        { 
         rootPanel.clear(); 
         PanelB.setMessageFromPreviousPage("Message set in Panel CCCCCC"); 
         rootPanel.add(PanelB.getInstance()); 
        } 
       }); 

       add(btnPanel); 
      } 

      public static PanelC getInstance() 
      { 
       if (panel == null) 
       { 
        panel = new PanelC(); 
       } 
       return panel; 
      } 
     } 

回答

0
Any idea why Panel B does not update its UI? 
01第一时间时使用 PanelB.getInstance() PanelB实例创建

因为,然后messageLabel创建,它也设定值。而您在更改消息后第二次从PanelC调用同一方法时,此时它使用的是PanelB的相同实例,而不是新对象。并根据您的编码,您正在更改messageFromPreviousPage变量的值而不是标签文本。所以你没有在UI上找到任何改变。

如果要更改标签文本,则将messageLabel声明为globel变量静态标签和更改标签。即

private static Label messageLabel; 
private PanelB() 
{ 
//your code 
} 
public static PanelB getInstance() 
{ 
    if (panel == null) 
    { 
     panel = new PanelB(); 
    } 
    else 
    { 
     messageLabel.setText(messageFromPreviousPage); //Require to set Text Again 
    } 
    return panel; 
}