我有一个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>
这里的问题是两个网格上的列现在都不再简洁了。什么可以解决这个问题?
请注意,我只有三行,因此为每个rendered
和outputLabel
元素添加inputText
属性会非常繁琐。
答案 0 :(得分:3)
<h:panelGrid>
渲染器仅将直接 <ui:fragment>
子项视为表格单元格,而不是更深层次的嵌套单元格。 UIComponent
实际上也是rendered
。因此,它成为一个包含所有嵌套子项的单个表格单元格。
您有2个选项,具体取决于<c:if>
条件的来源:
如果在视图构建期间可用,请改用<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>
否则,如果在视图构建期间无法保证可用,请删除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);
}
}
}