HtmlPanelGroup - 绑定 - h:panelGroup 树深度

HtmlPanelGroup - binding - h:panelGroup tree depth

我遇到过几次这个问题,但似乎我不确定如何解决这个问题...如果我将 HtmlPanelGroup 用作:

客户:

<h:panelGroup ... binding="#{myBean.myPanelGroup}">
</h:panelGroup>

支持 bean:

@ManagedBean(name="myPanelGroup")
@RequestScoped
public class G0 extends HtmlPanelGroup{
  ...
  public void addComp(ActionEvent e){
   HtmlCommandButton commandButton=new HtmlCommandButton();
   commandButton.setValue("aValue");

   G1 g1=new G1();
   g1.addComp(commandButton);

   this.getChildren().add(g1);
}
}

另一个对象:

@FacesComponent(value="myPanel")
public class G1 extends HtmlPanelGroup{
  ...
  @PostConstruct
  public void init(){this.setLayout("block");}
  public void addComp(UIComponent c){this.getChildren().add(c);}//bare button only :(
}

出于某种原因,生成的 HTML 包含 bare 命令按钮,根本没有被 G1(div)包围 :P

p.s taglib.xml 确实包含 G1 配置:

...
    <tag>
    <tag-name>aTag</tag-name>
    <component>
      <component-type>myPanel<component-type>
    </component>
    </tag>
...

编辑

或者 h:panelGroup-s 像这样的树可能会导致类似的问题:

客户端:

<h:panelGroup ... binding="#{gBean.g}"/>

支持 bean :

    public class G extends HtmlPanelGroup{
    ...
    HtmlPanelGroup g0;
    HtmlPanelGroup g1;
    HtmlPanelGroup g2;

    @PostConstruct
    public void init(){
       g0=new HtmlPanelGroup();
       g0.setStyleClass("g0");
       g1=new HtmlPanelGroup();
       g1.setStyleClass("g1");
       g2=new HtmlPanelGroup();
       g2.setStyleClass("g2");

       g0.getChildren().add(g1);
       g1.getChildren().add(g2);
       this.getChildren().add(g0);
    }
    ...
    }

和豆子:

    @ManagedBean(name="gBean")
    @RequestScoped
    public class GBean {
      ...
      private G g;
      ...
      @PostConstruct
      public void initGBean(){
      g=new G(); 
    }

    public void addComp(ActionEvent e){
      HtmlCommandButton c=new HtmlCommandButton();
      c.setValue(""+Math.random());

      this.g.getChildren().add(c);
}
     //getters setters
    }

所以我的问题是…… 是什么原因造成的,如何解决或有解决方法?

而且我仍然不确定 JSF 框架中 div 的 (h:panelGroup) 树深度是否有限制?如果不是如何解决它,因为它很烦人;或者有更多的替代方法吗?

谢谢

如果不是@ManagedBean,似乎@PostConstruct不起作用(如果我错了请纠正我);对于扩展 HtmlPanelGroup 的对象(参见代码片段):

public class G extends HtmlPanelGroup{
    ...
    HtmlPanelGroup g0;
    HtmlPanelGroup g1;
    HtmlPanelGroup g2;

    @PostConstruct
    public void init(){
       g0=new HtmlPanelGroup();
       g0.setStyleClass("g0");
       g1=new HtmlPanelGroup();
       g1.setStyleClass("g1");
       g2=new HtmlPanelGroup();
       g2.setStyleClass("g2");

       g0.getChildren().add(g1);
       g1.getChildren().add(g2);
       this.getChildren().add(g0);
    }
    ...
    }

为了调用方法,我决定使用构造函数作为(参见代码片段)

public class G extends HtmlPanelGroup{
    ...
    HtmlPanelGroup g0;
    HtmlPanelGroup g1;
    HtmlPanelGroup g2;


   public G(){
     this.init();
   }

    public void init(){
       g0=new HtmlPanelGroup();
       g0.setStyleClass("g0");
       g1=new HtmlPanelGroup();
       g1.setStyleClass("g1");
       g2=new HtmlPanelGroup();
       g2.setStyleClass("g2");

       g0.getChildren().add(g1);
       g1.getChildren().add(g2);
       this.getChildren().add(g0);
    }
    ...
    }

...在 jsf 的情况下,所谓的 backing bean 可以使用某种常见的 POJO 方式;


p.s。我仍在解决这个问题,所以请随时评论提示:)

干杯