大家好,今天来给大家说说jtree的优化,江郎才尽,这次是对swing的个人分享最后一个组件了。
扯点题外话,最近分享代码的过程中,有一些朋友提到“不要重复造轮子”,大家肯定不会反驳这句话,因为说的很对,但是我们必须知道轮子是怎么造出来的呢,万一哪天轮子坏了,人家又不给可咋办?
好了,不多说了,还是先说一下优化思路:
1、重写cellRenderer渲染器;
2、消除节点连线;
3、重绘node节点;
4、居左对齐;
5、鼠标特效。
来几张图片,大家看看如何一步步的优化:
原生态jtree,不多说,放在这里只是为了让大家对优化过后的界面,能有更好的理解
重写渲染器,这里需要注意,从根节点开始为一级节点,getLevel方法从0开始,我的代码里面DemoNode为了简单,就没有拆分成两个node,而是通过getLevel方法判断从而返回不同的UI
去掉连接线,实现这个效果很简单,直接调用JTree.putClientProperty("JTree.lineStyle", "None")即可,这里将其作为一个步骤来讲解,是因为在第四步中也可以实现这个效果,所以需要注意避免重复
基本OK了,但是我们还需要来一个好友签名,继承DefaultMutableTreeNode重绘节点UI,这里重绘的node节点,jtree的渲染器在加载jtree列表时会来调用
上面几步完成之后我们看到的效果已经差不多了,但是若是加上边框,大家是不是发现了什么?对,就是连接线去掉了,但是位置却没有让出来
继承BasicTreeUI,重写里面的四个方法:paintVerticalLine、paintHorizontalLine、setLeftChildIndent、setRightChildIndent,我们看到这两个单词Vertical、Horizontal是不是熟悉,水平和垂直,这就和第二步中的去掉连接线有联系了,二者取其一,第二步中若是去除了连接线,第四步就可以不需要了
OK,大家将边框线条去掉,就可以看到一个完美的jtree了。
第五步,我们来追求一下完美,加上鼠标特效
思考:大家看了代码之后会发现,鼠标特效的过程缺陷很大,因为有嵌套for循环,所以当节点很多的时候效率就会有些低下了,这里最完美的办法是将鼠标事件加入到重绘的node节点UI上,可惜经过测试发现事件只能加在jtree上,因为节点经过渲染器之后,本身的事件竟然生效不了了,好忧伤,若是有朋友发现有好的方法可以告诉我一声,感激不尽