强制换行OutputLabel

时间:2013-05-02 13:12:44

标签: css jsf primefaces line-breaks

我有一个outputLabel,其中包含大量文本(大约5000个字符的文本),outputLabel必须在行约200px后添加一个新行,这可能吗?

<p:outputLabel value="#{object.body}" />
<p:outputLabel value="#{object.body}" style="width: 200px" />

此代码不起作用:

public String getBodyWithLineBreaks(){
    return body.replaceAll("(.{100})", "$1<br/>");
}

它也不是一个解决方案,因为这个方法不会查看单词是否完成,它只是在第100个字符处开始一个新行。

更多代码:

<p:dataTable id="dataTable" var="object" value="#{notificationOverview.objects}">

     <!--Some more columns...-->  

    <p:rowExpansion>  
        <h:panelGrid id="display" columns="2" cellpadding="4" style="width:300px;"  
                                                 styleClass=" ui-widget-content grid">  
        <f:facet name="header">Notification Information</f:facet>
        <h:outputText value="Sender:"/>
        <h:outputText value="#{object.sender.username}"/>

        <h:outputText value="Time send:"/>
        <h:outputText value="#{object.dateSend}">
            <f:convertDateTime pattern="yyyy-MM-dd HH:mm:ss"/>
        </h:outputText>

   <h:outputText value="Title:"/>
   <h:outputText value="#{object.title}"/>
</h:panelGrid>

<br/><br/>

<div style='width: 200px;'>
   <h:outputText value="#{object.body}" />
</div>
</p:rowExpansion>
</p:dataTable>

1 个答案:

答案 0 :(得分:6)

<p:outputLabel>生成HTML <label>元素,默认情况下为inline element。您无法设置内联元素的尺寸。您只能在block element上设置它。

一种方法是将display: block添加到样式中。

<p:outputLabel value="#{object.body}" style="display: block; width: 200px;" />

此外,鉴于它位于<p:dataTable>单元格内,默认情况下其CSS white-space属性设置为nowrap,您需要将其设置回normal 。这可以在同一个组件上设置,但最好是在父<p:column>本身上设置:

<p:column style="white-space: normal;">

注意:作为良好做法的一部分,您应该更喜欢styleClass而不是style


对于具体问题,

不相关HTML <label> element旨在标记由for属性标识的输入元素。即当您单击它时,关联的输入元素将检索焦点(并选中复选框/单选按钮)。执行验证时,标签用于标识输入元素。但是,您尝试在标签元素中显示5000个字符这一事实,这在用作真实标签时完全是用户不友好的,这表明您实际上是为了显示“纯文本”的错误目的而滥用标签。您应该使用<h:outputText>代替。这会生成一个HTML <span>元素,默认情况下也是一个内联元素。所以上面的答案也适用于此:

<h:outputText value="#{object.body}" style="display: block; width: 200px;" />