display标签扩展:根据表头控制列宽

/***********本人原创,欢迎转载,转载请保留本人信息*************/
作者: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>

你可能感兴趣的:(jsp,servlet)