java - 为什么 Primefaces 不刷新我的按钮?

标签 java jsf jakarta-ee valuechangelistener

我正在构建一个允许用户管理任务的应用程序。任务监控屏幕可由两个用户同时访问。每个用户都可以查看任务当前是否正在运行,并且可以停止或启动它。每当一个用户启动/停止任务时,另一用户必须在自己的屏幕上看到任务状态的变化。

但是,我构建的代码不起作用。当用户启动任务时,其他用户的屏幕会尝试立即停止该任务。然后某种“ war ”开始:第一个用户的屏幕重新激活任务,第二个用户的屏幕重新停止任务,依此类推。

我怎样才能避免这场 war ?

这是我的代码:

taskMonitoring.xhtml

<p:poll
      interval="5"
      process="sbbActivateTask" />

<h:outputLabel 
      value="Activate task:" />

<p:selectBooleanButton
      id="sbbActivateTask"
      value="#{taskBean.state}"
      onLabel="YES"
      offLabel="NO"
      valueChangeListener="#{taskBean.switchTask}"/>

TaskBean.java

@ManagedBean(name = "taskBean")
@ViewScoped
public class TaskBean {

   public void setState(boolean b) {
      // I deliberately put nothing here ...
   }

   public boolean getState() {
       return TaskManager.getState();
   } 

   public void switchTask() {
       TaskManager.switchTask();
   } 
}

最佳答案

我猜当民意调查触发并更新 <selectBooleanButton> 时,它看到变化并触发 valueChangeListener ,将其切换回来,从而出现竞争条件。我不想在同一个控件中混合状态和命令。

我的建议:与 showcase of the component 相同的代码。即:

<p:selectBooleanButton
   id="sbbActivateTask"
   value="#{taskBean.state}"
   onLabel="YES"
   offLabel="NO"
>
    <p:ajax listener="#{taskBean.switchTask}"/>
</p:selectBooleanButton>

这样,只有当用户实际按下按钮时才会触发该操作。

为了使按钮以可视方式更新,您需要添加 update属性为poll :

<p:poll
  interval="5"
  process="sbbActivateTask"
  update="selectBooleanButton" />

关于java - 为什么 Primefaces 不刷新我的按钮?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21117073/

相关文章:

java servlet cos多部分: save inpustream for later storage

jsf - PrimeFaces - SelectOneMenu 中的工具提示

java - 从 Eclipse 运行 Tomcat 时避免 Permgen Space 错误

java - PreparedStatement IN 子句替代方案?

java - RxJava1 和 RxJava2 的区别

java - SDN4 不返回嵌套实体

jsf - 如何使用 h :commandLink and f:ajax 渲染面板组

jakarta-ee - 我需要帮助弄清楚为什么Ant会给我这个错误消息(设置Java Pet Store)?

发图片到粉丝专页墙的Java代码

java - 客户端如何通过外部IP地址连接到服务器?