电脑桌面
添加蚂蚁七词文库到电脑桌面
安装后可以在桌面快捷访问

【亚伟-EASCloud系列】之KDTable实现树型展示的两种方式

来源:金蝶云社区作者:金蝶2024-09-168

【亚伟-EASCloud系列】之KDTable实现树型展示的两种方式

一、利用KDTable的TreeColumn列实现

优缺点

    优点:标准实现方式,实现简单

    缺点:不够清晰美观,且须多加一后汇总行

效果图

 image.webp

实现步骤

1、添加空间行
kdtEntry.addRow(0);
2、设置表格树列深度
kdtEntry.getTreeColumn().setDepth(3); 
3、设置数据行极次
kdtEntry.getRow(0).setTreeLevel(0);
 
for(int i=1,size=kdtEntry.getRowCount();i<size;i++){
    if(i%6==1){
        kdtEntry.getRow(i).setTreeLevel(1);
    }else{
        kdtEntry.getRow(i).setTreeLevel(2);
    }
}


二、修改某树型结构列渲染器,重写表格绘制方法实现 

优缺点

    估点:结构清晰美观,可定制

    缺点:实现相对复杂

效果图

 image.webp

 

实现步骤

1、以表格某一列为原型,创建树型数据结构类,如上图“序号”列

class NumberExpandInfo {
 
    private String id;//节点ID
    private String number;//节点编码
    private String longNumber;//节点长编码
    private boolean isExpandStatus;//是否已展开
    private int level;//节点极次
    private boolean isLeaf;//是否叶子节点
    private boolean isEffective;//是否明细(用于控制行背景着色)
 
    protected NumberExpandInfo() {
        id = null;
        number = null;
        longNumber = null;
        isExpandStatus = false;
        level = 0;
        isLeaf = false;
        isEffective = true;
    }
 
    public boolean isExpandStatus() {
        return isExpandStatus;
    }
 
    public void setExpandStatus(boolean isExpandStatus) {
        this.isExpandStatus = isExpandStatus;
    }
 
    public String getId() {
        return id;
    }
 
    public void setId(String id) {
        this.id = id;
    }
 
    public String getNumber() {
        return number;
    }
 
    public void setNumber(String number) {
        this.number = number;
    }
 
    public String getLongNumber() {
        return longNumber;
    }
 
    public void setLongNumber(String longNumber) {
        this.longNumber = longNumber;
    }
 
    public String toString() {
        return number;
    }
 
    public int getLevel() {
        return level;
    }
 
    public void setLevel(int level) {
        this.level = level;
    }
 
    public boolean isLeaf() {
        return isLeaf;
    }
 
    public void setLeaf(boolean isLeaf) {
        this.isLeaf = isLeaf;
    }
 
    public boolean isEffective() {
        return isEffective;
    }
 
    public void setEffective(boolean isEffective) {
        this.isEffective = isEffective;
    }
}
 
2、创建单元格渲染器,继承com.kingdee.bos.ctrl.kdf.util.render.IBasicRender接口,实现draw方法
class BgItemTreeRender implements IBasicRender {
 
    private int TABSIZE;//绘图离表格左边框间隔
    private int ICONSIZE;//图标大小
    private int margin;//图标与表格边框间距
    protected SimpleTextRender simpleRender;//文本渲染器
    protected HashMap acctIdToPos;
 
    protected BgItemTreeRender() {
        TABSIZE = 8;
        ICONSIZE = 10;
        margin = 2;
        simpleRender = new SimpleTextRender();
        acctIdToPos = new HashMap();
    }
 
    protected void drawExpanded(Graphics g, int x, int y) {
        g.drawRect(x, y, ICONSIZE, ICONSIZE);
        int lineSize = ICONSIZE - 2 * margin;
        g.drawLine(x + margin, y + ICONSIZE / 2, x + margin + lineSize, y
                + ICONSIZE / 2);
    }
 
    protected void drawCollapsed(Graphics g, int x, int y) {
        g.drawRect(x, y, ICONSIZE, ICONSIZE);
        int lineSize = ICONSIZE - 2 * margin;
        g.drawLine(x + margin, y + ICONSIZE / 2, x + margin + lineSize, y
                + ICONSIZE / 2);
        g.drawLine(x + ICONSIZE / 2, y + margin, x + ICONSIZE / 2, y
                + margin + lineSize);
    }
 
    protected void drawLeaf(Graphics g, int x, int y) {
        int lineSize = ICONSIZE - 2 * margin;
    }
 
    protected boolean inRect(NumberExpandInfo numberExpandInfo, int x, int y) {
        String acctId = numberExpandInfo.getNumber();
        Rectangle rec = (Rectangle) acctIdToPos.get(acctId);
        if (rec != null)
            return rec.getX() < (double) x
                    && rec.getX() + rec.getWidth() > (double) x;
        else
            return false;
    }
 
    /**
     * 接口方法,取出单元格value,绘置树型展示效果
     */
    public void draw(Graphics graphics, Shape clip, Object obj, Style style) {
        if (obj instanceof NumberExpandInfo) {
            NumberExpandInfo numberExpandInfo = (NumberExpandInfo) obj;
            int ident = numberExpandInfo.getLevel() * TABSIZE;
            Rectangle rect = clip.getBounds();
            int x = rect.x + ident;
            int y = rect.y + (rect.height - ICONSIZE) / 2;
            Rectangle iconRect = new Rectangle(x, y, ICONSIZE, ICONSIZE);
            acctIdToPos.put(numberExpandInfo.getNumber(), iconRect);
            simpleRender.draw(graphics, new Rectangle(x + ICONSIZE
                    + TABSIZE, rect.y, rect.width - x - ICONSIZE - TABSIZE,
                    rect.height), numberExpandInfo.getNumber(), style);
            paintIcon(graphics, numberExpandInfo, iconRect);
        } else if (obj != null)
            simpleRender.draw(graphics, clip, obj.toString(), style);
    }
 
    private void paintIcon(Graphics graphics,
            NumberExpandInfo numberExpandInfo, Rectangle iconRect) {
        if (numberExpandInfo.isLeaf())
            drawLeaf(graphics, iconRect.x, iconRect.y);
        else if (numberExpandInfo.isExpandStatus())
            drawExpanded(graphics, iconRect.x, iconRect.y);
        else if (!numberExpandInfo.isExpandStatus())
            drawCollapsed(graphics, iconRect.x, iconRect.y);
    }
}
 
3、初始化表格渲染器
 
BgItemTreeRender treeRender = new BgItemTreeRender();
kdtEntry.getColumn("treeCell").setRenderer(treeRender);
 
4、初始化单元格数据结构,并渲染
 
setTreeDisplayStyle(0, kdtEntry.getRowCount()-1);//onload时调用
 
/**
 * 初始化树节点列单元格数据结构,并渲染
 */
protected void setTreeDisplayStyle(int start, int end)
{
    IRow row = null;
    for(int i = start,count = end; i <= count; i++)
    {
        row = kdtEntry.getRow(i);
        if(row == null || row.getCell("treeCell") == null)
            continue;
        String id = row.getCell("treeCell").getValue().toString();
        Object numberValue = row.getCell("treeCell").getValue();
 
        String number = numberValue.toString();
        String longNumber = row.getCell("treeCell").getValue().toString();
        int level = number.split("\\.").length<=1?1:2;
        boolean isLeaf = number.split("\\.").length<=1?false:t

【亚伟-EASCloud系列】之KDTable实现树型展示的两种方式

一、利用KDTable的TreeColumn列实现优缺点 优点:标准实现方式,实现简单 缺点:不够清晰美观,且须多加一后汇总行效果图 实现步...
点击下载文档文档为doc格式

声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。如若本站内容侵犯了原著者的合法权益,可联系本站删除。

已经是第一篇
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息
QQ群
  • 答案:my7c点击这里加入QQ群
支持邮箱
微信
  • 微信