2012-03-18 49 views
0

我不知道如果我嘗試完成所有可能的事情,所以我會很感激任何幫助。 我基本上試圖做的是創建一個在線跳棋遊戲,用戶可以在這裏互相競爭或計算機。遊戲的邏輯是在EJB內部的,到目前爲止它工作正常。到目前爲止,我已經完成了玩家電腦遊戲,並且它運行良好 - 玩家選擇移動的起點和終點(而邏輯決定它們是否有效),然後計算機移動它,然後更新棋盤。然而,目前有兩個問題,我想解決: 1)我希望電腦的舉動發生在玩家完成後大約一秒鐘。它的工作原理 - 但是板子沒有更新(我會在後面解釋爲什麼) 2)電腦移動後,我想讓它影響的方塊閃爍幾次。jsf 2延遲+閃爍後更新bean的UI

我的船上,每平方米是一個命令按鈕,如下所示:

<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' 消氣看起來是這樣的:

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

在「clickImg '功能內部的豆,我檢查是否有任何廣場已被挑選,否則我知道廣場被選爲移動的起源;否則,我調用EJB的移動函數,它返回一個更新的電路板圖,之後我調用'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

你可以引入HTTP推送與websockets,但這並不是微不足道的。 PrimeFaces組件庫對此具有a <p:push> component。但更簡單的方法是直接計算下一步,並讓JSF打印一行JavaScript代碼,它將執行更新作業客戶端setTimeout(callback, millis)

其次,使用Timer/TimerTask是一個非常糟糕的想法,在一個所謂的終身運行的Java EE Web應用程序中。永遠不要想到以後再做。您應該使用java.util.concurrent API或服務器提供的任務計劃程序。這不是您quesiton的答案(您已經擁有它;使用HTTP push或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 2012-03-19 20:27:50