gpt4 book ai didi

java - jsf 2在延迟+闪烁后从bean更新UI

转载 作者:行者123 更新时间:2023-12-01 15:29:15 25 4
gpt4 key购买 nike

我不确定我尝试完成的任务是否可行,所以我将不胜感激。我基本上想做的是创建一款在线跳棋游戏,用户可以在其中相互竞争或与计算机竞争。游戏的逻辑位于 EJB 内部,到目前为止运行良好。到目前为止,我已经完成了玩家-计算机游戏,并且运行良好 - 玩家选择移动的起点和目的地(而逻辑决定它们是否有效),然后计算机使其移动,然后更新棋盘。但是,目前我想解决两个问题:1)我希望计算机的移动发生在玩家完成后大约一秒钟。它有效 - 但是董事会没有更新(我稍后会解释原因)2)计算机让它移动后,我希望它影响的方 block 闪烁几次。

在我的板上,每个方 block 都是一个命令按钮,如下所示:

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

在我的 bean 中,'imgSrc' getter 看起来像这样:

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

在 bean 内的“clickImg”函数中,我检查是否已选取任何方 block ,否则我知道该方 block 已被选取为移动的原点;否则,我调用 EJB 的 move 函数,它返回更新的棋盘 map ,之后我调用“getImgSrc”函数,它更新棋盘,然后我调用 EJB 的计算机 move 函数,它也返回更新的棋盘 map ,然后我再次调用“getImgSrc”,这会更新板本身。
但是,如果我尝试使用计时器调用计算机的移动功能,如下所示 -

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

一秒钟后调用“getMachineMove”函数,该函数调用“getImgSrc”,但板未更新。它不会更新,因为“FacesContext.getCurrentInstance()”返回 null。我希望我足够清楚 - 如果我是,我将不胜感激任何形式的帮助(以及如何让某些命令按钮从 bean 中闪烁的想法)。

干杯,电子报

最佳答案

存在几个严重的概念错误。

首先,您只能向 HTTP 请求发送 HTTP 响应。当没有 HTTP 请求时,您无法发送 HTTP 响应。 HTTP请求仅由客户端发起。 FacesContext存储在HTTP请求线程中。这就解释了为什么没有 FacesContext在你的计时器线程中。

您可以使用 websockets 引入 HTTP 推送,但这并不完全是微不足道的。 PrimeFaces 组件库有 a <p:push> component为了那个原因。但更简单的方法是直接计算下一步,让 JSF 打印一行 JavaScript 代码,该代码在客户端执行更新作业 setTimeout(callback, millis) .

其次,使用Timer/TimerTask对于一个被认为是终身运行的 Java EE Web 应用程序来说,这是一个极其糟糕的主意。永远不要想以后再做一次。您应该使用java.util.concurrent API或服务器提供的任务调度程序。这不是您问题的答案(您已经有了它;使用 HTTP 推送或 JS),但要了解更多信息,请查看 Spawning threads in a JSF managed bean for scheduled tasks using a timer

关于java - jsf 2在延迟+闪烁后从bean更新UI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9762572/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com