2016-06-30 14 views
1

Ich habe ein Problem in PrimeFaces Panel Update.Panel Update in PrimeFaces

Ich habe ein Hauptfeld, das zwei Ausgangspanel enthält. Jedes Ausgabefeld kann eine Schaltfläche enthalten, bei der es sich um eine Auslagerungsschaltfläche handelt. Die Schaltfläche "Auslagerungsschaltfläche" wird verwendet, um die Ausgabefläche von einer zur anderen zu tauschen.

Wenn ich die Schaltfläche Aktion zum Rendern der Panels aktualisieren, die ich brauche, um die Hauptfeld-ID bereitzustellen, funktioniert es einwandfrei. Aber für eine Baumstrukturhierarchie, wenn ich die zwei Ausgabepanel-IDs geben möchte, wird das Panel nicht gerendert. Die Schaltfläche Aktion wurde nur einmal aufgerufen, wenn ich das Protokoll zur Bestätigung einfüge.

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

Jeder Fehler, den Sie im Serverprotokoll oder im Browser erhalten haben. weil ich nur vorbei kopieren und es funktioniert so weit. –

+0

Ich habe faces-config verwendet, um die Managed Bean zu deklarieren. Der Name des verwalteten Beans entspricht dem Klassennamen. Verwenden Sie den Session-Bereich nicht Ansichtsbereich –

Antwort

1

Ich bin ein bisschen ein n00b, wenn:

Ich werde meinen Code-Beispiele anhängen unten es kommt zu JSF, aber ich hatte ähnliche Probleme. Ich denke, die Boolesche Werte in Ihrem PanelRendered Klasse sollte Getter genannt haben, wie folgt:

public boolean isMainPanelRendered() 
public boolean isSubPanelRendered() 

Die Ausdruckssprache in der XHTML-Datei verwendet, bleibt gleich. Es scheint eine Konvention zu sein, dass der Ausdruck Sprache "ist" an die Front hinzufügen und den Buchstaben vor dem Durchsuchen der Bean für die Eigenschaft (Funktion oder Variable) groß schreiben wird.

So folgt aus:

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

bleibt gleich. Bearbeitet: hinzugefügt } zuletzt von gerendert. Edited: klar, dass es einen Getter für die private Variable benötigen würde

+1

Wenn wir Getter und Setter verwenden, erstellt es automatisch das Präfix is ​​der Variablen. Ich hoffe, das ist nicht das Problem. Ich probiere es in allen meinen Projekten. –

+1

Ich habe nicht wirklich in der Lage, Dokumentation zu finden, um dies zu untermauern, aber es war die Erfahrung, die ich in dem JSF primefaces Projekt hatte, an dem ich arbeitete. Wir haben einen VCH-Ansatz anstelle eines JavaBeans-Stils verwendet, aber ich habe keinen Grund zu der Annahme, dass sich die Konvention dort ändert. –

+0

Durch die Kapselung der booleschen Variablen wird der Getter/Setter erzeugt. Der Getter/Setter kann die Instanznamen für die Ausdruckssprache erstellen, die Sie in JSF erwähnt haben. Ich habe auch deine Technik ausprobiert, aber es hat auch versagt. Der JSF benötigt Getter und Setter, um mit der Java-Klasse zu binden. –

2

können Sie einige Richtlinie JAVA-Code

  • Verwenden Sie eine korrekte Namensgebung für Bean folgen als Klassennamen PanelRendered ist, und Sie werden mit dem gleichen Namen in XHTML-Datei, und Sie haben Ihre @ManagedBean @ViewScoped nicht so posten, so nehme ich an, dass Ihr Bean-Name auf XHTML sollte panelRendered nicht PanelRendered sein.
  • Verwenden Sie @PostConstruct, um Variable in JSF-Bean zu initialisieren. vermeiden Sie, Java-Konstruktor zu verwenden.

XHTML-Code: ich PanelRendered-panelRendered nur den Namen Bohne ändern und ich bin Update-Panel wie diese update="mainPanelId"

Und Ihr Code an meinem Ende funktioniert gut, wenn Sie einen Fehler haben hier bitte posten .

Ihre Frage Aber für eine Strukturhierarchie Baum, Wenn ich die beiden Ausgabefeld Ids geben bedeuten Es machen nicht das Panel.

, wenn die Komponente mit rendered="false" ist es daher kein HTML-Code auf Browser erzeugt, so dass Sie nicht das id="subOutputPanel" Tag in Ihrem outputed HTML-Code finden, und wenn Sie auf Befehlsschaltfläche klicken Sie die Rückseite Bean-Methode aufrufen und kommen zu aktualisieren update="mainOutputPanel,subOutputPanel" hat es nicht gefunden subOutputPanel ID und Ajax-Aufruf wird fehlschlagen, und Sie werden nicht richtiges Verhalten oder UI erhalten. und ab dem nächsten Mal rief es nichts mehr auf, für Stop-Call-Back-Bean-Methode können Sie studieren, was passierte, nachdem Primage-Gesichter Ajax scheitern. hoffe das wird dir helfen.

+0

Wenn Sie mainPanelId geben funktioniert es gut für meine Seite selbst. Aber wenn Sie die zwei Output-Panel-ID geben, funktioniert es nicht. Ich möchte nach dem Grund fragen. Warum funktionieren die SubPanel Id Updates hier nicht? –

+0

sehe meinen aktualisierten Code. Danke, und wenn Sie einverstanden sind, akzeptieren Sie bitte meine Ans. –

+0

Ich verstehe das Konzept jetzt, aber wie konnte ich beides Id aktualisieren. Ist es möglich.? Ich habe das gleiche Update mit zwei Textfeldern versucht, es funktioniert perfekt. Bitte machen Sie klar. –