TWaver局部自动布局及嵌套Group处理

TWaver提供了一些布局算法帮助我们快速为网元设置位置,很多情况下已经够用了,但是对于一些复杂的布局还需要我们自己做一些处理,看下面这个例子:

运行截图:



这个时候直接使用TNetwork#doLayout就不好使了,因为doLayout会对network中所有网元使用同一种布局算法,但是截图中Group下多个子Group各有自己的布局方式,我的解决办法是,先对最外层的Group整个布局,然后递归遍历子Group,单独对他们进行布局。

代码实现:

 TWaver中实现局部布局可以通过两种方式:

  • 将要布局的Element加入到一个新的TNetwork中,然后用新的TNetwork布局
  • TWaver默认只对选中的Element布局,所以可以将要布局的Element加入到SelectionModel中

在这个demo中,首先用第一种方式对最外层的Group进行布局:

//layoutNetwork是用来布局的临时network
//生成Group时,已经将布局方式存入ClientProperty
layoutDatabox.addElementWithDescendant(group1);
layoutNetwork.doLayout((Integer)group1.getClientProperty("layout"),false);

 

然后递归遍历group,为子group布局

recursionChild(group1);
............................................

 private void recursionChild(Group group){
        for(int i=0;i<group.getChildren().size();i++){
            Element element= (Element) group.getChildren().get(i);
            if(element instanceof Group){
                Group childGroup=((Group)element);
                recursionChild(childGroup);//如果有子Group,会一直递归
//使用两种方式结合,将要布局的子group加入到layoutNetwork的SelectionModel
                layoutDatabox.getSelectionModel().clearSelection();
                layoutDatabox.getSelectionModel().appendSelection(childGroup.getChildren());
                layoutNetwork.doLayout((Integer) ((Group) element).getClientProperty("layout"), false);
                layoutDatabox.getSelectionModel().clearSelection();
            }
        }
    }

最后附上全部代码

public class LayoutTest extends JPanel {
    TDataBox layoutDatabox=new TDataBox();
    TNetwork layoutNetwork=new TNetwork(layoutDatabox);
    public LayoutTest(){

        TNetwork network=new TNetwork();

        ResizableNode gatewayNode=new ResizableNode();

        gatewayNode.putCustomDraw(true);
        gatewayNode.putCustomDrawShapeFactory(TWaverConst.SHAPE_ROUND_RECTANGLE_HALF);
        gatewayNode.putCustomDrawGradient(false);
        gatewayNode.putCustomDrawFillColor(new Color(254, 254, 206));
        gatewayNode.setSize(70, 30);
        gatewayNode.setName("Gateway");
        gatewayNode.putLabelPosition(TWaverConst.POSITION_CENTER);

        Group group1=createGroup(4,TWaverConst.LAYOUT_TREE);
        Group group1_1=createGroup(12,TWaverConst.LAYOUT_CIRCULAR);
        Group group1_2=createGroup(5,TWaverConst.LAYOUT_EAST);

        Link group1_2Link=new Link((Node)group1.getChildren().get(0),(Node)group1_2.getChildren().get(0));
        setLinkStyle(group1_2Link);
        group1.addChild(group1_2);
        group1.addChild(group1_2Link);

        Link group1_1Link=new Link((Node)group1.getChildren().get(0),(Node)group1_1.getChildren().get(0));
        setLinkStyle(group1_1Link);
        group1.addChild(group1_1);
        group1.addChild(group1_1Link);

//layoutNetwork是用来布局的临时network
//生成Group时,已经将布局方式存入ClientProperty
        layoutDatabox.addElementWithDescendant(group1);
        layoutNetwork.doLayout((Integer)group1.getClientProperty("layout"),false);
        recursionChild(group1);

        TDataBox box=new TDataBox();
        box.addElementWithDescendant(group1);
        box.addElement(gatewayNode);

        group1.putGroupOpaque(true);
        group1.putGroupFillColor(new Color(154,206,254));
        network.setDataBox(box);
        this.setLayout(new GridLayout(1,3));
        this.add(network);

        Layer layer=new Layer();
        box.getLayerModel().addLayer(layer);
        box.getLayerModel().moveToTop(layer);

        Link link1=new Link(group1,gatewayNode);
        setLinkStyle(link1);
        link1.setLinkType(TWaverConst.LINK_TYPE_ORTHOGONAL);
        link1.setLayerID(layer.getID());
        box.addElement(link1);
    }

    /**
     * 递归Group设置布局
     * @param group
     */
    private void recursionChild(Group group){
        for(int i=0;i<group.getChildren().size();i++){
            Element element= (Element) group.getChildren().get(i);
            if(element instanceof Group){
                Group childGroup=((Group)element);
                recursionChild(childGroup);//如果有子Group,会一直递归
//使用两种方式结合,将要布局的子group加入到layoutNetwork的SelectionModel
                layoutDatabox.getSelectionModel().clearSelection();
                layoutDatabox.getSelectionModel().appendSelection(childGroup.getChildren());
                layoutNetwork.doLayout((Integer) ((Group) element).getClientProperty("layout"), false);
                layoutDatabox.getSelectionModel().clearSelection();
            }
        }
    }
    /**
     * 产生测试Group及Node
     * @param childCount
     * @param layout
     * @return
     */
    private Group createGroup(int childCount,int layout){
        Group group=new Group();
        group.setExpand(true);
        group.putClientProperty("layout",layout);

        ResizableNode router=new ResizableNode();
        router.putCustomDraw(true);
        router.putCustomDrawShapeFactory(TWaverConst.SHAPE_RECTANGLE);
        router.putCustomDrawGradient(false);
        router.putCustomDrawFillColor(new Color(254, 254, 206));
        router.setSize(60, 20);
        router.setName("Router");
        router.putLabelPosition(TWaverConst.POSITION_CENTER);
        group.addChild(router);

        for(int i=0;i<childCount;i++){
            Node childNode=new Node();
            Link link=new Link(router,childNode);
            childNode.putCustomDraw(true);
            childNode.putCustomDrawShapeFactory(TWaverConst.SHAPE_RECTANGLE);
            childNode.putCustomDrawGradient(false);
            childNode.putCustomDrawFillColor(new Color(254,202,2));
            childNode.setName("C"+i);
            childNode.putLabelPosition(TWaverConst.POSITION_CENTER);

            setLinkStyle(link);
            group.addChild(childNode);
            group.addChild(link);
        }
        return group;
    }

    /**
     * 设置link样式
     * @param link
     */
    public void setLinkStyle(Link link){
        link.putLinkColor(Color.black);
        link.putLinkOutlineWidth(0);
        link.putLinkWidth(1);
        link.putLinkAntialias(true);
        link.putLinkToArrow(true);
        link.putLinkToArrowOutline(false);
    }
    public static void main(String[] args){
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame=new JFrame("布局");
                frame.setSize(1000,700);
                frame.setContentPane(new LayoutTest());
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }
}
 
代码和思路都很简单,希望能抛砖引玉,大家有建议或好的想法也可以交流一下

 

twaver 官方文档 TWaver官方资料,最权威的资料 达芬奇的密码 立即下载

相关推荐

twaver.js使用示例

twaver示例可直接放到jetty下运行,含twaver.js alarm.html资源。

TWaver中文社区

TWaver中文社区隆重开张: http://twaver.servasoft.com ,社区还提供了一个中文论坛:http://twaver.servasoft.com/forum 这个社区的文章质量相当高,而且全是原创,非常值得一看。国内这样质量的社区非常罕见。

solo的专栏 7904

TWaver 4.1最新试用jar包 及Demo

TWaver 4.1最新试用jar包 及Demo 从官网申请下载来的代码

twaver flex学习及资料网站

http://help.2bizbox.net/dashboard.action  文档http://twaver.servasoft.com/    twaver中文社区(论坛中也有很多有用的东西)

sebastain的专栏 1169

twaver-flex中文用户手册

twaver-flex中文用户手册和相关资料 非常强大

TWaver-java-4.1最新 官网试用版jar包及Demo

TWaver-java-4.1最新 官网试用版jar包及Demo

Group共享网元

熟悉TWaver的用户都知道Group的概念,如果是Group,那必然会出现一个网元在多组的情况,最近有客户遇到这个问题,给写了Demo,这些也跟大家分享一下如何实现,先让我们看看共享网元的效果。

TWaver可视化 1044

【Web服务器运维】基于Nginx与Keepalived的高可用负载均衡系统部署:实现故障自动切换与虚拟IP管理

内容概要:本文详细介绍了如何通过Nginx与Keepalived实现高可用的负载均衡架构。首先讲解了Nginx的安装部署流程,包括依赖环境的准备、源码解压编译、启动及配置重载;接着介绍了Keepalived的安装步骤及其服务管理方式;重点在于通过配置Keepalived的主备节点(MASTER/BACKUP),结合VRRP协议和虚拟IP(VIP)实现故障自动切换,并通过自定义脚本nginx_check.sh实时检测Nginx运行状态,确保服务高可用;最后补充了在云环境中因组播限制导致心跳不稳定时,应改用单播(unicast)方式进行通信的解决方案。; 适合人群:具备Linux系统操作基础、熟悉网络基础知识,从事运维、DevOps或Web服务部署的技术人员,尤其是工作1-3年的工程师。; 使用场景及目标:①搭建高可用的Web负载均衡系统,避免单点故障;②掌握Nginx与Keepalived协同工作的原理与实战配置方法;③应用于生产环境中提升服务稳定性与容灾能力。; 阅读建议:学习时应结合实验环境动手操作,重点关注keepalived.conf配置差异与nginx_check.sh脚本逻辑,理解VRRP机制及单播替代组播的实际应用场景,注意根据实际网络环境调整IP与网卡参数。

TWaver拓扑图形界面组件

TWaver是美国Serva Software公司的产品,是应用最为广泛的电信专业图形界面开发工具包,在电信行业应用非常广泛。

shanzhizi的专栏 3582

rk3399 linux 5.10 usb 2.0设备上电概率性注册失败

先排除硬件上的问题,然后就烧录kernel 4.1的的镜像,多次测试也没有发现这个问题,所以排除了硬件上的问题,然后。查下usb hub和usb 4G的复位脚,写驱动都给它们配上了,但是还是存在这个问题。最后通过对比rk3399.dtsi发现少了个power-domains = ;多次开关机,发现usb hub和4G都通信失败了,这就有点奇怪了,按理说usb驱动是没啥问题的。加上后,重新编译烧录,重新测试没有发现这个问题了!先查看usb log。

qq_32017483的博客 2673

构建高可用CephFS NFS网关:NFS-Ganesha与RADOS集群的深度整合

本文详细介绍了如何构建高可用的CephFS NFS网关,通过NFS-Ganesha与RADOS集群的深度整合,实现高效文件共享。文章涵盖核心架构、部署实战、性能调优及避坑指南,帮助用户解决Ceph客户端兼容性问题,提升存储访问效率。特别强调高可用设计,确保服务稳定性,适用于金融、电商等高要求场景。

weixin_26976635的博客 254

超强的TWaver Demo

 http://www.servasoftware.com/twaver.php?p_id=17 

solo的专栏 3277

Vue3+codemirror6实现公式(规则)编辑器

vue3+codemirror6+ts实现公式编辑器,可以插入标签、公式,也有补全提示

小阮的笔记本 5047

拓扑图巨头TWaver

      最近因为工作的原因,巧遇了一个做拓扑图的巨头---TWaver(http://www.servasoftware.com/),为之震惊!教程见http://doc.servasoftware.com/pages/viewpage.action?pageId=16547885。

natian306的专栏 2353

Oracle EBS订单的流程(Order->AR)

基本流程创建订单路径:Order Management > Orders,Returns > Sales Orders填写订单头信息,客户,订单类型,销售人员填写订单体信息,输入物料,数量...然后Book Order,订单Book之后,你会发现订单头的Status的状态变成了“Booked”,订单行的状态为"Awaiting Shipping",记录下来你的订单号,后边的每一步都需要这个订单号。

田攀的日志 4万+

保姆级教程:用中移ML307模组对接高德/OneOS定位服务,从配置apikey到解析+MLBSLOC状态码

本文详细介绍了如何使用中移ML307系列模组对接高德/OneOS定位服务,从配置apikey到解析+MLBSLOC状态码的全过程。涵盖高德定位服务和OneOS定位服务的配置步骤、常见错误处理及性能优化技巧,帮助开发者快速实现基站定位功能,提升物联网项目的定位精度和稳定性。

weixin_30632089的博客 507

twaver 类清单和概要说明

twaver.Alarm 告警对象。代表告警状态。是一个轻量级的对象。可以创建很多然后放到DataBox中。所有的Alarm对象存放在由ElementBox提供的AlarmBox中。通过setPropertyValue可以带入新的信息。 twaver.network.ui.AlarmAttachment 典型的应用是在网元的旁边产生一个告警的标识。可指定位置,文字等样式。还可通过子类改变默认...

没有遥远 496

使用LSTM(长短期记忆)模型处理文本数据的典型流程

对于序列到序列的任务(如机器翻译),可以使用LSTM的隐状态来生成目标序列。这些向量捕获了词之间的语义关系,每个词都被表示为一个高维空间中的点,语义上相似的词在向量空间中彼此靠近。这通常是通过创建一个词汇表(vocabulary)来实现的,词汇表中的每个词都会被分配一个唯一的数字ID。:由于LSTM等循环神经网络(RNN)需要固定长度的输入,所以需要将不同长度的句子填充到相同的长度。由于计算机不能直接理解连续的文本,第一步是将文本分割成独立的词或标记(token)。:将词嵌入作为输入传递给LSTM模型。

YHKKun的博客 2500

Twaver-HTML5技术入门

相关资源: twaver技术博客  http://www.cnblogs.com/twaver/ twaver论坛  http://twaver.servasoft.com/forum/viewforum.php?f=13&sid=82a30ae32d6849dbcbbe007d84aa5164 官方文章  http://twaver.servasoft.com/category/twav

bolonzhangmail的博客 4426

GEE生物量预测:利用多源遥感数据和随机森林算法RF构建地上生物量(AGB)预测模型,并实现未来年份的生态变化模拟(大面积生物量反演)

数据融合策略:整合5类遥感产品(AGB、NDVI、LAI、土地覆盖、地形)时序特征构建:采用生长季中值法降低云污染影响机器学习优化分层采样保证数据代表性80棵决策树平衡精度与效率预测可靠性基准期R²达0.76需结合地面实测数据校正。

此星光明博客 419

下采样优化实战:用ADown显著提升YOLOv11的多尺度特征保持能力

ADown 以“可编程梯度信息+多分支特征融合”打破了传统下采样的性能壁垒,为 YOLOv11 带来了多尺度特征的精准传递能力。从原理到代码集成,本教程已为你铺就了一条“小目标检测精度跃升”的实战路径。现在就动手尝试吧——当你看到模型对极小目标也能精准识别,且特征图细节完整时,你会明白这份技术探索的价值。我很乐意在你实践过程中帮你解决任何问题,让我们一起推动目标检测在下采样领域的边界。

FJN110的博客 421

TWaver 2.0正式发布

从JavaDesktop.org得知消息,TWaver 2.0已经正式 发布。它包含了Web和GIS两个新的产品分支,以及增强的Chart和Swing组件集合。新版本还带来了新的在线演示程序: Online Demo (基于Java Web Start,需要安装Java 1.4或更高版本) Online Demo (基于Java Applet,需要安装Java 1.4或更高

solo的专栏 1323

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Twaver-HTML5基础学习(33)自动布局

Twaver-HTML5基础学习(33)自动布局

见贤思齐焉,见不贤内自省 1069

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

TWaver初步学习笔记

[size=medium] 因为并没有在专案中用过,仅靠个人自学了解,觉得TWaver是一个主要用来建立拓扑关系的图形界面工具包。用到的第三方包为:TWaver.jar。 可以参考官网的教程:http://doc.servasoftware.com/display/TWaverJava Swing Component Description DataBox Provide...

凤凰的领悟 265

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

HTML5,不只是看上去很美(第三弹:萌萌哒拓扑图分组)

前言 这段时间承蒙大家厚爱,给了我相当大码字的动力,决定节前再更一弹。最近养成了回顾总结的好习惯,sf真是个不错的地方。 最近忙着给客户折腾一个复杂的多层嵌套关系。客户一句话“要好看!”,哥就忙白了头啊,还好赶在节前解决了,不然真的要随广大股民排队投江庆祝端午了。 需求描述 先简单描述下这次客户的需求。 现实应用中,网络拓扑图结...

weixin_34178244的博客 393
上一篇: TWaver With JavaFX
下一篇: TWaver 3D for Flex 3.0发布
subnetwork
博客等级 码龄17年 17粉丝 84原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值