2012-03-18 11 views
0

私が達成しようとしていることがすべて可能であるかどうかわからないので、助けていただければ幸いです。 私が基本的にしようとしているのは、ユーザーがお互いに競い合うことができるオンラインチェッカーゲームを作ることです。ゲームのロジックはEJBの内部にあり、これまでのところうまく動作します。これまでのところ、私はプレーヤーのコンピュータゲームを完成させました。そして、それはうまくいきます - プレイヤーは移動の起点と目的地を選びます(論理が有効かどうかを決定しながら)、その後コンピュータが移動し、 。 しかし、現在解決したい2つの問題があります。 1)プレイヤーが完了してから約1秒後にコンピュータの動きが発生します。それは動作します - しかし、ボードは更新されません(私は後で説明します) 2)コンピュータが移動した後、私は影響を受ける四角形を数回点滅させたい。私のボード上のjsf 2遅れ+点滅後のBeanからUIを更新

、各正方形は次のようになりますコマンドボタンです:「clickImgで

public String getImgSrc() 
{ 
    FacesContext fc = FacesContext.getCurrentInstance(); 
    UIComponent c = UIComponent.getCurrentComponent(fc); 
    String cID = c.getId(); 
    String output = "/resources/EMPTY_BOX.jpg"; 
    String currOption = gameBoard.get(cID); 
    if (currOption != null) 
    { 
     output = "/resources/" + currOption + ".jpg"; 
    } 
    return output; 
    } 

:私の豆で

<h:commandButton id="B1" image="#{CodeBean.imgSrc}" actionListener="#{CodeBean.clickImg()}" action="#{CodeBean.update}" onmouseover="this.src='#{CodeBean.overImgSrc}'" onmouseout="this.src='/CheckersClientSide#{CodeBean.imgSrc}'"> 
    <f:ajax render="@form" /> 
</h:commandButton> 

、 'IMGSRC' ゲッターは、このようになります'関数がBeanの内部にあるかどうかを確認します。そうでない場合は、正方形が移動の起点として選択されたことがわかります。それ以外の場合は、更新されたボードマップを返すEJBのmove関数を呼び出します。その後、ボードを更新する 'getImgSrc'関数を呼び出し、次に更新されたボードのマップを返すEJBのコンピュータ移動関数を呼び出します私は 'getImgSrc'をもう一度呼び出し、ボード自体を更新します。
しかし、私はこのような、タイマーを使用して、コンピュータの移動機能を呼び出そう -

Timer timer = new Timer(); 
timer.schedule(new TimerTask() 
{ 
    @Override 
    public void run() 
    { 
     getMachineMove(); 
    } 
} , 1000); 

「getMachineMove」関数が第二の後にコールされ、その機能は「getImgSrc」が、ボードを呼び出します更新されません。 'FacesContext.getCurrentInstance()'がnullを返すため、更新されません。 私は十分にはっきりしていることを願っています。私がいた場合は、何らかの助けに感謝します。

歓声、 エレズ

答えて

1

いくつかの重大な概念的な間違いがあります。

最初に、HTTP要求に対してHTTP応答のみを送信できます。 HTTP要求がない場合、HTTP応答を送信することはできません。 HTTP要求は、クライアントによってのみ開始されます。 FacesContextは、HTTP要求スレッドに格納されます。これは、あなたのタイマースレッドにFacesContextがない理由を説明しています。

WebSocketでHTTPプッシュを導入することもできますが、これは必ずしも簡単なことではありません。 PrimeFacesコンポーネントライブラリにはa <p:push> componentがあります。しかし、簡単に次の動きを直接計算して、JSFに、更新ジョブクライアント側でsetTimeout(callback, millis)というJavaScriptコード行を出力させることができます。

第2に、Timer/TimerTaskを使用すると、おそらく寿命の長いJava EE Webアプリケーションが実行されていると非常に悪い考えです。後でもう一度やり直すことは決して考えないでください。 java.util.concurrent APIまたはサーバー提供のタスクスケジューラーを使用する必要があります。これはあなたの質問に対する答えではありません(HTTPプッシュまたはJSを使用していますが、詳細はSpawning threads in a JSF managed bean for scheduled tasks using a timer

+0

)詳細な回答はありがとうございます。 私は 'ScheduledExecutorService'を非常に簡単に管理していますが、PrimeFaceのプッシュを実装しようとしたときに、それはうまくいきませんでした(例は単純ですが)。私は答えがここにあると思う - http://blog.primefaces.org/?p=1440、私はGlassFish 3.0を使っている。 したがって私はJS内でタイムアウトを実装しようとします – eRez