/***********本人原创,欢迎转载,转载请保留本人信息*************/
作者:wallimn 电邮:
[email protected] 时间:2009-09-28
博客:http://wallimn.iteye.com
网络硬盘:http://wallimn.ys168.com
/***********文章发表请与本人联系,作者保留所有权利*************/
display标签(displaytag)对于表格宽度的控制不是很智能,因此有了通过包装器来扩展其功能的想法。
最终实现的功能就是:根据表头标题的宽度,来自动分配表列的宽度,提供两种模式:字符宽度模式(使用em)及百分比模式,<display:column/>标签中指定headerClass="nosize"的时候,该的宽度不进行控制,这样这个列可以根据整个表格的宽度自动扩展。
一包装器类的代码:
package com.wallimn.gyz.util;
import java.util.List;
import javax.servlet.jsp.PageContext;
import org.displaytag.decorator.TableDecorator;
import org.displaytag.model.HeaderCell;
import org.displaytag.model.TableModel;
/**
* 自动根据表格标题长度计算表格的宽度<br/>
* 博客:http://wallimn.iteye.com
* 编码:wallimn 时间:2009-9-26 上午10:18:29<br/>
* 版本:V1.0<br/>
*/
public class ThWidthCalcWrapper extends TableDecorator {
private int WidthType;
/**
* 构造器
* @param widthType 1:表示使用字符宽度为单位进行控制;
* 2:表示使用百分比进行控制
*/
public ThWidthCalcWrapper(int widthType){
this.WidthType = widthType;
}
/**
* 默认构造器,使用字符宽度的单位进行控制
*/
public ThWidthCalcWrapper(){
this.WidthType=1;
}
@SuppressWarnings("unchecked")
@Override
public void init(PageContext pageContext, Object decorated,
TableModel tableModel) {
List list = tableModel.getHeaderCellList();
if(this.WidthType==2){
StringBuffer sb = new StringBuffer();
for(java.util.Iterator it=list.iterator();it.hasNext();){
HeaderCell hc = (HeaderCell) it.next();
sb.append(hc.getTitle());
}
int totalLen = sb.length();
int curLen = 0;
String title = null;
String style = null;
Object thclass = null;
for (java.util.Iterator it = list.iterator(); it.hasNext();) {
HeaderCell hc = (HeaderCell) it.next();
thclass = (String) hc.getHeaderAttributes().get("class");
//若指定class="nosize",则对宽度不进行控制
if(thclass!=null
&& "nosize".equals(thclass.toString()))continue;
title = hc.getTitle();
curLen = Math.round(title.length() * 100 / totalLen);
style = (String) hc.getHeaderAttributes().get("style");
hc.getHeaderAttributes().put("style",
getStyle(style , "width:" + curLen + "%;"));
}
}
else if(this.WidthType==1){
String title = null,style = null;
Object thclass = null;
for(java.util.Iterator it=list.iterator();it.hasNext();){
HeaderCell hc = (HeaderCell) it.next();
thclass = hc.getHeaderAttributes().get("class");
//若指定class="nosize",则对宽度不进行控制
if(thclass!=null
&& "nosize".equals(thclass.toString()))continue;
title = hc.getTitle();
style = (String)hc.getHeaderAttributes().get("style");
hc.getHeaderAttributes().put("style",
getStyle(style , "width:" + title.length() + "em;"));
}
}
super.init(pageContext, decorated, tableModel);
}
private String getStyle(String oldStyle,String newStyle){
//判断一下是否有style设置
if (oldStyle == null || "".equals(oldStyle)) {
return newStyle;
} else {
return ";"+newStyle;
}
}
}
二、jsp中使用示例
<display:table name="${results.rows}" id="row"
class="gyz dtt"
style="table-layout:fixed;"
decorator="com.wallimn.gyz.util.ThWidthCalcWrapper">
<display:column property="dm" title="代码"/>
<display:column property="mc" title="名称" headerClass="nosize"/>
<display:column property="jb1" title="级 别1"/>
<display:column property="jb2" title="级 别2"/>
<display:column property="jb3" title="级 别3"/>
</display:table>