当前位置: 首页 > 知识库问答 >
问题:

PrimeFaces中的面板更新[重复]

郭弘盛
2023-03-14

我在PrimeFaces面板更新中遇到问题。

我有一个主面板,其中包含两个输出面板。每个输出面板可能包含一个按钮,即交换面板。交换面板按钮用于将输出面板从一个交换到另一个。

如果我更新渲染面板的按钮操作,我需要提供主面板ID,它可以正常工作。但是对于树结构层次结构,如果我打算给出两个输出面板ID,它不会渲染面板。当我把日志确认这一点时,按钮操作只调用了一次。

我将附上以下代码示例:

renderingPanel.XHTML

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:p="http://primefaces.org/ui"
      xmlns:ui="http://java.sun.com/jsf/facelets" 
      xmlns:c="http://java.sun.com/jsp/jstl/core">

    <h:head>
        <title>
           Panel Rendered
        </title>
    </h:head>
    <h:body>
        <f:event listener="#{PanelRendered.initializePageAttributes}" type="preRenderComponent"/>

        <h:form id="panelFormId">
            <p:panel id="mainPanelId" widgetVar="mainPanelId">
                <p:outputPanel id="mainOutputPanel" rendered="#{PanelRendered.mainPanelRendered}">
                    <h:outputText value="hello main"/>
                    <p:commandButton id="mainSwap" value="Swap To Sub Panel" update="mainOutputPanel,subOutputPanel" action="#{PanelRendered.mainButtonAction}" icon="ui-icon-transferthick-e-w"/>
                </p:outputPanel>

                <p:outputPanel id="subOutputPanel" rendered="#{PanelRendered.subPanelRendered}">
                    <h:outputText value="hello sub"/>
                    <p:commandButton id="subSwap" value="Swap To Main" update="subOutputPanel,mainOutputPanel"  action="#{PanelRendered.subButtonAction}" icon="ui-icon-transferthick-e-w"/>
                </p:outputPanel>

            </p:panel>
        </h:form>
    </h:body>
</html>

PanelRendered.Java

public class PanelRendered
{

    private boolean mainPanelRendered;
    private boolean subPanelRendered;
    private Logger logger = Logger.getLogger(PanelRendered.class);

    public PanelRendered()
    {
         File configFile = new File("/home/nafeel/Applications/apache-tomcat-7.0.34/webapps/treetable/conf" + File.separator + "log4j.properties");
        if (configFile.exists())
        {
            PropertyConfigurator.configure(configFile.getAbsolutePath());
        }
        else
        {
            System.out.println("Configuration Logger File not available");
        }
    }

    public String mainButtonAction()
    {
        logger.info("Enter inside main button action");
        mainPanelRendered = false;
        subPanelRendered = true;
        return null;
    }

    public String subButtonAction()
    {
        logger.info("Enter inside sub button action");
        mainPanelRendered = true;
        subPanelRendered = false;
        return null;
    }

    public void initializePageAttributes()
    {
        logger.info("Enter inside initializepage");
        mainPanelRendered = true;
        subPanelRendered = false;
    }

    /**
     * @return the mainPanelRendered
     */
    public boolean isMainPanelRendered()
    {
        return mainPanelRendered;
    }

    /**
     * @param mainPanelRendered the mainPanelRendered to set
     */
    public void setMainPanelRendered(boolean mainPanelRendered)
    {
        this.mainPanelRendered = mainPanelRendered;
    }

    /**
     * @return the subPanelRendered
     */
    public boolean isSubPanelRendered()
    {
        return subPanelRendered;
    }

    /**
     * @param subPanelRendered the subPanelRendered to set
     */
    public void setSubPanelRendered(boolean subPanelRendered)
    {
        this.subPanelRendered = subPanelRendered;
    }
}

共有2个答案

周弘盛
2023-03-14
匿名用户

当涉及到JSF时,我有点00b,但我也有过类似的问题。我认为您的PanelRender类中的布尔值应该有如下名称的getter:

public boolean isMainPanelRendered()
public boolean isSubPanelRendered()

XHTML文件中使用的表达式语言保持不变。表达式语言在搜索bean以查找属性(函数或变量)之前将在前面添加“is”并将字母大写似乎是一种约定。

因此:

rendered="#{PanelRendered.mainPanelRendered}"
rendered="#{PanelRendered.subPanelRendered}"

保持不变。编辑:在渲染的最后添加了}。编辑:意识到私有成员变量需要一个getter

贲高寒
2023-03-14

你能遵循一些JAVA代码指南吗

  • 使用适当的bean命名,因为您的类名是PanelRendered,并且您在xhtml文件中使用相同的名称,并且您还没有发布您的@ManagedBean@ViewScoped,所以我假设您在xhtml上的bean名称应该是PanelRendered,而不是PanelRendered

XHTML代码:我只是将bean名称从PanelRendered更改为PanelRendered,我是这样更新panel的

并且您的代码在我这里运行良好,如果您有任何错误,请在这里发布。

你的问题是,但对于树结构层次结构,如果我想给出两个输出面板ID,它不会渲染面板。

如果组件与渲染="false"它没有在浏览器上生成任何超文本标记语言代码,所以你没有找到id="subOutputGroup"标记在你输出的超文本标记语言代码中,当你点击命令按钮它调用back bean方法并来更新update="main OutputGroup, subOutputGroup"它没有找到subOutputGroupid和ajax调用将失败,你不会得到正确的行为或UI。

 类似资料:
  • 我有一个datatable,其中包含删除行的按钮,我想在之后刷新该表。刷新工作很好,除了一个案例,当我删除最后一个项目。我相信这是因为属性,它在ajax更新时表现不佳。它都在一个复合组件中,datatable是有条件呈现的,看起来都是这样的: 除了我从列表中移除最后一个项目(并希望表消失)的情况外,这工作得很好。通过ajax显示表不是问题,因为我添加的项目也没有提交,并且表在添加第一个项目后正确显

  • 我是一个Java GUI初学者,在让我的面板按照我想要的方式进行更新方面遇到了一些麻烦。基本上,当用户点击我的GUI中的一个按钮时,屏幕上当前的形状应该改变为与按钮按下对应的任何形状。我的代码在下面。更新后的形状在显示前被原始形状覆盖的问题。 最后,这里是我的框架类: 谢谢你的帮助!

  • 我有一个模式对话框,其中用户可以根据另一个用户选择和取消选择角色,然后将其提交到数据库以进行更新。 > 加载应用程序 数据库中有一个角色为“admin”的用户 我尝试编辑这个用户,对话框打开,“管理”复选框被选中。

  • 我正在使用prime faces仪表盘。我有2个面板要显示。一个带有“行动”,另一个带有“我的任务”。我面临的问题是两个面板没有按照窗口大小(面板宽度)拉伸。如果我给出宽度:100%也不起作用。但如果我以像素为单位给出宽度和高度,它的工作。有没有什么办法我可以给出宽度和高度的百分比。

  • 问题内容: 我想Ajax使用Primefaces更新JavaScript脚本。 我如何在showMarker中将该值更新为ajax? 问题答案: 将其放在JSF标记中并提供ID。 并有一个按钮或链接是否执行某些操作,并对此进行更新

  • 我有一个表单,其中包含所需的数据,我使用了以下代码: 在同一页面上有一个datatable,它包含我通过表单添加的对象(付款)。添加对象后,我使用以下代码对datable进行更新以添加新对象: 我遇到的问题是,当数据没有输入,我单击按钮,更新完成,表显示为空!但是,验证消息正确地显示为强制数据。 datatable是 我在CDI中使用,因为托管bean如下所示://import //类 }