如何在panelGrid中插入条件行,同时保持行简洁?

时间:2017-03-13 14:01:48

标签: jsf

我有一个h:panelGrid,其中包含两列和各行:

<h:panelGrid columns="2">
    <p:outputLabel for="attr1" value="#{messages.attr1}" />
    <p:inputText id="attr1" value="#{viewBean.attr1}" />
    <p:outputLabel for="attr2" value="#{messages.attr2}" />
    <p:inputText id="attr2" value="#{viewBean.attr2}">
    <p:outputLabel for="attr3" value="#{messages.attr3}" />
    <p:inputText id="attr3" value="#{viewBean.attr3}" />
</h:panelGrid>

现在,有些行应该只是有条件地存在。在示例中,这可以是attr2和attr3。当我在它们周围构建<ui:fragment />时,条件渲染起作用(见下文),但是jsf尝试将整个块放入一个<td />表格单元格中。

<h:panelGrid columns="2">
    <p:outputLabel for="attr1" value="#{messages.attr1}" />
    <p:inputText id="attr1" value="#{viewBean.attr1}" />
    <ui:fragment rendered="#{viewBean.myCondition}">
        <p:outputLabel for="attr2" value="#{messages.attr2}" />
        <p:inputText id="attr2" value="#{viewBean.attr2}">
        <p:outputLabel for="attr3" value="#{messages.attr3}" />
        <p:inputText id="attr3" value="#{viewBean.attr3}" />
    </ui:fragment>
</h:panelGrid>

另一种选择是创建两个panelGrid。一个用于第一个块,一个用于第二个块:

<h:panelGrid columns="2">
    <p:outputLabel for="attr1" value="#{messages.attr1}" />
    <p:inputText id="attr1" value="#{viewBean.attr1}" />
</h:panelGrid>
<h:panelGrid columns="2">
    <ui:fragment rendered="#{viewBean.myCondition}">
        <p:outputLabel for="attr2" value="#{messages.attr2}" />
        <p:inputText id="attr2" value="#{viewBean.attr2}">
        <p:outputLabel for="attr3" value="#{messages.attr3}" />
        <p:inputText id="attr3" value="#{viewBean.attr3}" />
    </ui:fragment>
</h:panelGrid>

这里的问题是两个网格上的列现在都不再简洁了。什么可以解决这个问题?

请注意,我只有三行,因此为每个renderedoutputLabel元素添加inputText属性会非常繁琐。

1 个答案:

答案 0 :(得分:3)

<h:panelGrid>渲染器仅将直接 <ui:fragment>子项视为表格单元格,而不是更深层次的嵌套单元格。 UIComponent实际上也是rendered。因此,它成为一个包含所有嵌套子项的单个表格单元格。

您有2个选项,具体取决于<c:if>条件的来源:

  1. 如果在视图构建期间可用,请改用<h:panelGrid columns="2"> <p:outputLabel ... /> <p:inputText ... /> <c:if test="#{viewBean.myCondition}"> <p:outputLabel ... /> <p:inputText ... /> <p:outputLabel ... /> <p:inputText ... /> </c:if> </h:panelGrid>

    <ui:fragment>
  2. 否则,如果在视图构建期间无法保证可用,请删除rendered并对子项重复<h:panelGrid columns="2"> <p:outputLabel ... /> <p:inputText ... /> <p:outputLabel ... rendered="#{viewBean.myCondition}" /> <p:inputText ... rendered="#{viewBean.myCondition}" /> <p:outputLabel ... rendered="#{viewBean.myCondition}" /> <p:inputText ... rendered="#{viewBean.myCondition}" /> </h:panelGrid> 条件。

    public class ExecutorTest {
    
        public static void main(String[] args) throws InterruptedException, ExecutionException {
            ThreadPoolExecutor executor = new ThreadPoolExecutor(10, (int)10, 5 * 60 , TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(1), new ThreadFactoryBuilder().setDaemon(true).build());
            executor.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy());
    
            while(true) {
                executor.submit(() -> {
                    System.out.println("Executing " + UUID.randomUUID().toString());
                });
                Thread.sleep(1000);
            }
    
        }
    
    }
    
  3. 另见: