h:datatable 中每一行的动态颜色

Dynamic color on every row in h:datatable

上下文

我正在处理一个非常旧的系统,它实际上正在崩溃,我的实际任务是修复它。

这个旧系统使用了我无法真正修改的旧库,因为它可能会修复系统的一小部分,但只会使其余部分更加损坏。不过,我可能可以添加不会干扰旧库的新库。

我的问题

我想做的是根据 rowStyleClass="#{searchTask.hasLinkedDecision(task) ? 'info' : ''}" 这样的服务器端条件在 table 的某些行上添加 class 但我找不到任何解决方案,因为显然有几个名为 JSF 的库,但其中 none 是相同的,而我的系统所依赖的库似乎是唯一不支持动态行样式 classes 的库。

JSF 依赖关系

<dependency>
    <groupId>com.sun.faces</groupId>
    <artifactId>jsf-api</artifactId>
    <version>2.2.4</version>
    <type>jar</type>
    <scope>compile</scope>
</dependency>
<dependency>
    <groupId>com.sun.faces</groupId>
    <artifactId>jsf-impl</artifactId>
    <version>2.2.4</version>
    <type>jar</type>
    <scope>compile</scope>
</dependency>

有问题的代码

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core">
.....
<h:dataTable id="dttask"
             binding="#{searchTask.taskTable.dataTable}"
             value="#{searchTask.taskTable.dataList}" var="task"
             styleClass="table table-striped table-hover">
         <!--rowStyleClass="#{searchTask.hasLinkedDecision(task) ? 'info' : ''}"-->

    <h:column>
        <f:facet name="header">
            <h:panelGroup>
                .....
            </h:panelGroup>
        </f:facet>
        <a href="${facesContext.externalContext.requestContextPath}/faces/pages/tasks/editing/add-tasks.xhtml?id=#{task.noTask}">
            <h:outputText value="#{task.noTask}"/>
        </a>
    </h:column>

    <h:column sortBy="">
        <f:facet name="header">
            <h:panelGroup>
                <h:outputText value="No CT"/>
            </h:panelGroup>
        </f:facet>

        <h:panelGroup rendered="#{not empty searchTask.getNoCT(task)}">
            <div class="tooltipobjet" tabindex="0"
                 style="border-bottom: 1px dotted black;">
                .....
            </div>
        </h:panelGroup>
    </h:column>

    <h:column>
        <f:facet name="header">
            <h:panelGroup>
                <h:commandLink actionListener="#{searchTask.sortDataListTask}">
                    .....
                </h:commandLink>
            </h:panelGroup>
        </f:facet>
        <abbr title="#{searchTask.getTaskLabel(task.principal)}">
            .....
        </abbr>
    </h:column>
    <h:column>
        <f:facet name="header">
            <h:panelGroup>
                <h:commandLink actionListener="#{searchTask.sortDataListTask}">
                    .....
                </h:commandLink>
            </h:panelGroup>
        </f:facet>
        <h:outputText value="#{searchTask.getLabelValueDomainSearch('domain.type.task', task.type)}"/>
    </h:column>
    <h:column>
        <f:facet name="header">
            <h:panelGroup>
                <h:commandLink actionListener="#{searchTask.sortDataListTask}">
                    .....
                </h:commandLink>
            </h:panelGroup>
        </f:facet>
        <div class="tooltipobject" tabindex="0"
             style="border-bottom: 1px dotted black;">
            .....
        </div>
    </h:column>
    <h:column>
        <f:facet name="header">
            <h:panelGroup>
                <h:commandLink actionListener="#{searchTask.sortDataListTask}">
                    .....
                </h:commandLink>
            </h:panelGroup>
        </f:facet>
        <h:outputText value="#{task.dateConform}">
            <f:convertDateTime pattern="#{constants.DATE_TIME_FORMAT_CREATE_JOUR_HH_MM}"/>
        </h:outputText>
    </h:column>
    <h:column>
        <f:facet name="header">
            <h:panelGroup>
                <h:commandLink
                        actionListener="#{searchTask.sortDataListTask}">
                    .....
                </h:commandLink>
            </h:panelGroup>
        </f:facet>
        <h:outputText value="#{searchTask.getAdminUnitAbbr(task.treatingAdminUnit)}"/>
    </h:column>
    <h:column>
        <f:facet name="header">
            <h:panelGroup>
                <h:commandLink actionListener="#{searchTask.sortDataListTask}">
                    .....
                </h:commandLink>
            </h:panelGroup>
        </f:facet>
        <h:outputText value="#{searchTask.getLabelValueDomainStatusByUser(task.status, task.statusEditDate)}"/>
    </h:column>
</h:dataTable>
.....
</html>

9 件事...最后一件就是您的答案

  1. 这个问题似乎与'stabelizing'一个几乎崩溃但有所改进的应用程序无关。
  2. JSF(在你的情况下是 Mojarra)2.2.4 不是 那么旧
  3. 看起来您使用的不是 jsp,而是 facelets
  4. 您无法使用 class 和 main 方法在普通 java-se sdk 中复制,并且没有其他库,因此问题上的 java 标签不是正确的。
  5. 没有几个叫做JSF的库,有一个api叫做JSF,它是由两个实现实现的。 Mojarra 和 MyFaces,都实现了相同的 api.
  6. 你在h:datatablehttps://docs.oracle.com/javaee/7/javaserver-faces-2-2/vdldocs-facelets/h/dataTable.html
  7. 上哪里看到rowStyleClass
  8. 如果你在编译时收到弃用警告,这通常意味着你确实使用了一些较新版本的库(较少的旧版本),但仍在使用以前版本的旧方法。
  9. 答案在Changing h:datatable cell color or style dynamically in JSF or with a little more code conditionally set class values for h:datatable cells
  10. 适合您的库版本的答案。如果您不想使用它并且不想 'duplicate' 在列中编码(而不是在列中),您可以创建一个小型复合组件