2012-12-24 60 views
0

我有一個簡單entrypoint類,只是加載面板異常裝載簡單的GWT視圖

public class TestUI implements EntryPoint 
    { 
     PanelA panelA = new PanelA(); 

     public void onModuleLoad() 
     { 
      final RootPanel rootPanel = RootPanel.get(); 

      rootPanel.add(panelA); 
     } 
    } 

這裏是PanelB

 public class PanelB extends HTMLPanel 
    { 
     public PanelB() 
     { 
      super("Panel B"); 
      final PanelA panelA = new PanelA(); 
      Button btnNewButton = new Button("Go to panel A"); 
      btnNewButton.addClickHandler(new ClickHandler() { 
       public void onClick(ClickEvent event) { 
        final RootPanel rootPanel = RootPanel.get(); 
        rootPanel.clear(); 
        rootPanel.add(panelA); 
       } 
      }); 
      add(btnNewButton); 
     } 

    } 

,這裏是A組

 public class PanelA extends HTMLPanel 
    { 
     public PanelA() 
     { 
      super("Panel A"); 
      final PanelB panelB = new PanelB(); 
      Button btnNewButton = new Button("Go to panel B"); 
      btnNewButton.addClickHandler(new ClickHandler() { 
       public void onClick(ClickEvent event) { 
        final RootPanel rootPanel = RootPanel.get(); 
        rootPanel.clear(); 
        rootPanel.add(panelB); 
       } 
      }); 
      add(btnNewButton); 
     } 
    } 

然而,當我嘗試加載包含此入口點的頁面,並在下面的異常跟蹤中失敗。 如果我用純HTML面板替換入口點中Panel A的引用,那麼它會正常加載。我的簡單面板有什麼問題? 我基本上試圖創建一個GUI,我可以在頁面之間來回點擊,我認爲這將是實現這一目標的第一步。

Exception in thread "Code server for stockwatcher from Mozilla/5.0 (Windows NT 6.1; WOW64; rv:17.0) Gecko/20100101 com.google.gwt.dev.shell.BrowserChannel$RemoteDeathError: Remote connection lost 
    at com.google.gwt.dev.shell.BrowserChannelServer.processConnection(BrowserChannelServer.java:536) 
    at com.google.gwt.dev.shell.BrowserChannelServer.run(BrowserChannelServer.java:363) 
    at java.lang.Thread.run(Unknown Source) 
Caused by: java.net.SocketException: Software caused connection abort: socket write error 
    at java.net.SocketOutputStream.socketWrite0(Native Method) 
    at java.net.SocketOutputStream.socketWrite(Unknown Source) 
    at java.net.SocketOutputStream.write(Unknown Source) 
    at java.io.BufferedOutputStream.flushBuffer(Unknown Source) 
    at java.io.BufferedOutputStream.flush(Unknown Source) 
    at java.io.DataOutputStream.flush(Unknown Source) 
    at com.google.gwt.dev.shell.BrowserChannel$ReturnMessage.send(BrowserChannel.java:1310) 
    at com.google.gwt.dev.shell.BrowserChannelServer.processConnection(BrowserChannelServer.java:533) 
    ... 2 more 

回答

3

您造成相互遞歸或循環依賴電話...下面是詳細的分析......

TestUI要創建的PanelA一個實例。 當你創建一個類的實例時會發生什麼?其構造函數被稱爲。在這種情況下,PanelA的構造函數被調用。在那裏你創建了一個PanelB的實例,因此PanelB的構造函數被調用。現在再次在PanelB中創建一個PanelA的實例,因此它的構造函數被調用並且該過程無限重複。更好的編程技術應該避免這種循環依賴。避免這一點,它會解決你的問題。

+0

是的,就是這樣,現在排序,乾杯 – MayoMan

0

隨着每一個小組正在創建,創建一個新的B組,這本身就是創造一個新的A組,這是創建一個新的B組,這是無限延續。也許這就是問題所在。 我想你應該只在onClick事件中調用面板B /面板A的構造函數。