Java JSF面板定位

Java JSF面板定位,java,jsf,primefaces,Java,Jsf,Primefaces,我可以设置面板的位置,然后进行更新,但在获取其当前位置时遇到问题 例如: 目前,我的面板位于(50,50) 拖动面板并按下按钮后,“样式”不会更新 那么,如何在拖动后获取面板的当前位置 编辑:顺便说一句,我使用的范围是@ViewScoped默认情况下,PrimeFacescommandButton组件使用Ajax功能运行,这意味着表单提交处理id为窗格的组件时,您需要在process属性中声明 <p:commandButton id="press" action="#{sbean.pres

我可以设置面板的位置,然后进行更新,但在获取其当前位置时遇到问题

例如: 目前,我的面板位于(50,50)

拖动面板并按下按钮后,“样式”不会更新

那么,如何在拖动后获取面板的当前位置


编辑:顺便说一句,我使用的范围是@ViewScoped

默认情况下,PrimeFaces
commandButton
组件使用Ajax功能运行,这意味着表单提交处理id为
窗格的组件时,您需要在
process
属性中声明

<p:commandButton id="press" action="#{sbean.press}" process="@this pane"
  update="@this pane" />

另一种选择是简单地处理和更新整个表单

<p:commandButton id="press" action="#{sbean.press}" process="@form"
  update="@form" />

或者,您可以简单地将Ajax功能设置为Off,它将像典型的表单提交控件一样运行

<p:commandButton id="press" action="#{sbean.press}" ajax="false" />

编辑:我发现Primefaces DragTable不会将组件的绝对位置更新为服务器的视图状态。这是不幸的,但是可以使用hiddenInputs和Javascript来解决

<script type="text/javascript">
  function updatePanelPosition() {
    var panel = jQuery('#testForm\\:pane');
    var hiddenLeftInput = jQuery('#testForm\\:hiddenLeft');
    var hiddenTopInput = jQuery('#testForm\\:hiddenTop');
    var left = panel.css('left');
    var top = panel.css('top');
    hiddenLeftInput.val(left);
    hiddenTopInput.val(top);
  }
</script>

<h:inputHidden id="hiddenLeft" value="#{viewScopedBean.leftProperty}" />
<h:inputHidden id="hiddenTop" value="#{viewScopedBean.topProperty}" />

<p:commandButton id="press" action="#{sbean.press}" process="@form"
   update="@form" onstart="updatePanelPosition()" />

函数updatePanelPosition(){
var panel=jQuery(“#testForm\\:pane”);
var hiddenLeftInput=jQuery(“#testForm\\:hiddenLeft”);
var hiddenTopInput=jQuery(“#testForm\\:hiddenTop”);
var left=panel.css('left');
var top=panel.css('top');
hiddenLeftInput.val(左);
hiddenTopInput.val(顶部);
}
在提交之前,两个隐藏的输入组件将被更新为
窗格
的当前left和top属性,然后这些值将被更新为托管bean属性,您可以在其中获取值


我知道这看起来很混乱,但最终这才是托管bean的真正优点,它就像一个视图控制器,包含表示逻辑。

默认情况下,PrimeFaces
commandButton
组件使用Ajax功能运行,这意味着,对于表单提交以处理id为
窗格的组件
,您需要在
过程
属性中声明

<p:commandButton id="press" action="#{sbean.press}" process="@this pane"
  update="@this pane" />

另一种选择是简单地处理和更新整个表单

<p:commandButton id="press" action="#{sbean.press}" process="@form"
  update="@form" />

或者,您可以简单地将Ajax功能设置为Off,它将像典型的表单提交控件一样运行

<p:commandButton id="press" action="#{sbean.press}" ajax="false" />

编辑:我发现Primefaces DragTable不会将组件的绝对位置更新为服务器的视图状态。这是不幸的,但是可以使用hiddenInputs和Javascript来解决

<script type="text/javascript">
  function updatePanelPosition() {
    var panel = jQuery('#testForm\\:pane');
    var hiddenLeftInput = jQuery('#testForm\\:hiddenLeft');
    var hiddenTopInput = jQuery('#testForm\\:hiddenTop');
    var left = panel.css('left');
    var top = panel.css('top');
    hiddenLeftInput.val(left);
    hiddenTopInput.val(top);
  }
</script>

<h:inputHidden id="hiddenLeft" value="#{viewScopedBean.leftProperty}" />
<h:inputHidden id="hiddenTop" value="#{viewScopedBean.topProperty}" />

<p:commandButton id="press" action="#{sbean.press}" process="@form"
   update="@form" onstart="updatePanelPosition()" />

函数updatePanelPosition(){
var panel=jQuery(“#testForm\\:pane”);
var hiddenLeftInput=jQuery(“#testForm\\:hiddenLeft”);
var hiddenTopInput=jQuery(“#testForm\\:hiddenTop”);
var left=panel.css('left');
var top=panel.css('top');
hiddenLeftInput.val(左);
hiddenTopInput.val(顶部);
}
在提交之前,两个隐藏的输入组件将被更新为
窗格
的当前left和top属性,然后这些值将被更新为托管bean属性,您可以在其中获取值


我知道这看起来很混乱,但最终这才是托管bean的真正优点,它就像一个视图控制器,包含表示逻辑。

我尝试了你的建议,但似乎在单击按钮后,我的面板回到了原来的位置。在press()方法中打印的输出仍然是我的初始样式值
position:absolute;左:50px;顶部:50px
@Francis Ah我的印象是Primefaces Draggable负责更新服务器端样式属性,但显然没有。我在上面发布了一篇编辑文章。请问InPurthidden
的作用是什么?如果我把它和代码放在一起,我的按钮不会调用该方法,但是如果我删除它,按钮会调用该方法。那
leftProperty
topProperty
呢?可以肯定的是。:)
inauthidden
组件是您单击按钮时将提交的附加表单字段。
leftProperty
topProperty
是必须添加到代码中的其他托管bean属性。当您单击该按钮时,当调用action方法时,新的托管bean属性将分别具有left和top的相应值。现在清楚了。谢谢你。这对我有很大帮助我尝试了你的建议,但似乎我的面板在点击按钮后回到了原来的位置。在press()方法中打印的输出仍然是我的初始样式值
position:absolute;左:50px;顶部:50px
@Francis Ah我的印象是Primefaces Draggable负责更新服务器端样式属性,但显然没有。我在上面发布了一篇编辑文章。请问InPurthidden的作用是什么?如果我把它和代码放在一起,我的按钮不会调用该方法,但是如果我删除它,按钮会调用该方法。那
leftProperty
topProperty
呢?可以肯定的是。:)
inauthidden
组件是您单击按钮时将提交的附加表单字段。
leftProperty
topProperty
是必须添加到代码中的其他托管bean属性。当您单击该按钮时,当调用action方法时,新的托管bean属性将分别具有left和top的相应值。现在清楚了。谢谢你。这对我有很大帮助Dit可能不会有什么不同,但您是否尝试过将组件直接绑定到bean?@kolossus这可能会更有效,而且更容易。@Francis在您的支持bean中创建并初始化您希望绑定的组件类型的成员变量,例如
Panel myPanel=new Panel()
(不要忘记g