2012-03-23 17 views
0

ここに行きます。これは私の初めてのウィッケットアプリケーションで、プッシュパネルの例を使ってicepushを統合しようとしています。"RequestCycleは現在設定されていません!"他のクラスから 'push()'を呼び出そうとしています。

私がしようとしているのは、別のクラスから 'updatePanel(String content)'メソッドを呼び出すことによってパネルに更新をプッシュすることです。

ここにコードがあります。

私が持っている私の拡張PushPanelで

:へ

ERROR (SelectorManager.run): org.apache.wicket.WicketRuntimeException: No RequestCycle is currently set! 
at org.apache.wicket.Component.getRequest(Component.java:1831) 
at org.apache.wicket.markup.html.WebPage.dirty(WebPage.java:315) 
at org.apache.wicket.Page.dirty(Page.java:288) 
at org.apache.wicket.Page.componentRemoved(Page.java:948) 
at org.apache.wicket.MarkupContainer.removedComponent(MarkupContainer.java:1422) 
at org.apache.wicket.MarkupContainer.remove(MarkupContainer.java:612) 
at uk.ac.warwick.collabtex.AsyncCommsPanel.updatePanel(AsyncCommsPanel.java:107) 
at uk.ac.warwick.collabtex.Editor$1.updateSuccess(Editor.java:98) 

答えて

3

ようこそ:私はデータ採集のコールバックメソッドから「UpdatePanelの」メソッドを呼び出すしようとすると、私はこの例外を取得

public AsyncCommsPanel(String id) { 
    super(id); 
    this.setOutputMarkupId(true); 

    ajaxForm = new Form("ajaxForm"); 
    ajaxForm.setOutputMarkupId(true); 

    ajaxForm.add(textStore = new Label("textStore","")); 

    ajaxForm.add(new AjaxButton("updateButton") { 
     @Override 
     protected void onSubmit(AjaxRequestTarget target, Form form) { 
      System.out.println("Update button pressed!"); 
      /* CODE TO PULL NEW DATA FROM ELSEWHERE */ 
      /* UPDATE TAKES TIME SO HAS ITS OWN CALLBACK */ 
     } 

     @Override 
     protected void onError(AjaxRequestTarget target, Form<?> form) { 
      System.out.println("Update button error."); 
     } 
    }); 
    add(ajaxForm); 
} 

@Override 
protected void pushCallback(AjaxRequestTarget target) { 
    target.add(ajaxForm); 
} 

public void updatePanel(String updateString) { 
    /* THIS METHOD SHOULD ALLOW THE PANEL TO BE UPDATED FROM ELSEWHERE */ 
    if (textStore != null) ajaxForm.remove(textStore); 
    ajaxForm.add(textStore = new Label("textStore", updateString)); 
    push(); 
} 

非同期の世界:-) ThreadLocals(Application、Session、ThreadLocal)は、http要求スレッド(別名ワーカースレッド)の処理中にのみ使用できます。 2つの問題があります:1)独自のスレッドを開始してThreadLocalを失う、2)エクスポートしても、ジョブが終了したときに応答が既に閉じられる可能性があります。私はIcePushの仕組みがわからないが、ここでは私が一番良い選択だと思うのは、アプリケーションを提出して(例えばマップ)それを参照してから、futureTask.isDone()を要求するajaxタイマーの動作を開始することです。定期的にtrueを返すと、必要な階層が変更されます(スタックトレースでMarkupContainer#remove()の呼び出しが表示されます)。

+0

これは非常に有望ですが、私は本当にあなたが示唆していることをする方法を理解していないのだろうかと思います。あなたは何が起こるべきか、いつ、より具体的になりますか? – icecreamhead

関連する問題