版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
TWaver基本编程2Element的选中机制所有的Element数据都可以被选中。选中状态是Element的重要状态之一,它在实现人机交互过程中非常常用。理解和使用Element选择,对于熟练掌握TWaver开发具有重要意义。使用选择状态所有TWaver的Element都有一个选中状态。要么选中,要么没选中,它是一个boolean值。可以使用函数isSelected/setSelected进行获取或设置。一个对象处于选中状态时,其外观会有一定的变化,对于不同的组件,这种变化也有所不同。例如,对于拓扑图组件来说,选中的数据会显示一个高亮外框,而对于树来说,选中数据会有一个高亮的背景框。如下图。实际上,这些默认的外观和行为都可以被定制和修改。后续章节我们将讲述这些用法。使用选择容器SelectionModelSelectionModel可以成为选择容器,是一个DataBox附属的一个容器,它维护着DataBox中所有的被选中的数据对象的引用。DataBox作为一个大容器,它负责所有容纳其中数据的管理。但是,为了让管理职责更加清晰和明确、易于使用,DataBox还拆分出一些附属的、相对独立的小容器,分管不同的任务。选择容器SelectionModel就是其中一个,专门负责管理数据的选中状态。其实,Element已经有了boolean值标识选中状态,那为何DataBox还要设置选择容器进行选中状态的管理呢?主要是为了开发者使用更加方便。举一个简单的例子:如果DataBox容纳了1万个节点,其中有10个被用户选中,并进行了"删除"操作。如果没有选择容器,我们只能通过遍历这1万个节点来获得这10个数据进行删除,效率和方便性上都不够好。而有了选择容器,则可以直接访问选择容器,将其中的10个节点删除即可,因为TWaver已经保证所有的选中节点都会出现在选择容器中。通过选择容器,还可以通过API对选择状态进行控制。例如,将数据加入选择容器会造成数据被选中;清空选择容器,会取消所有数据的选中状态,等等。当然,选择容器仅仅负责选择状态的管理。无论对这个容器怎么增、删、改操作,它仅仅影响数据的选中状态,而不会影响数据的其他属性,更不会导致数据从DataBox中被删除等行为。使用选择监听器设置右键菜单右键菜单也成为弹出菜单,本章介绍如何在拓扑图以及其他图形组件中使用右键菜单。右键菜单是一个非常常用的交互方法,通过对数据进行选择、右键菜单,可以快速调出上下文有关的操作选项,为软件使用者提供直观的交互方法。TWaver中,我们使用一个叫做弹出菜单生成器(PopupMenuGenerator)的接口,来制作各种不同的右键菜单。更多关于使用右键菜单的例子,请见后续章节。这里仅给出一个简单的例子,让读者了解弹出菜单是如何制作出来的。菜单生成器是一个接口,被设置在拓扑图或其他图形组件上。一旦设置,当鼠标右键点击图形组件时,TWaver就会回调这个接口获得右键菜单。TWaver会将当前的一些操作场景传入,例如被点击的图形组件、鼠标事件等等。我们要做的,就是根据这些信息,动态的生成需要的右键菜单,返回即可。具体的菜单显示等细节,TWaver会帮我们完成。以下弹出菜单的例子弹出一个菜单,把所有的选中的对象的名字用菜单项显示出来。代码被封装在函数step4中。privatevoidstep4(){//CreateapopupmenugeneratorPopupMenuGeneratorpopupMenuGenerator=newPopupMenuGenerator(){/***Addtheidentifierofeachoftheselectedobjectstothemenu.*Inthisexample,theitemsaddedtothemenudonothing.*Inarealapplication,youwouldprobablyassociatean*implementationoftheSwingActioninterfacewitheachmenuitem.*/publicJPopupMenugenerate(TViewtview,MouseEventmouseEvent){//Createanemptypop-upmenu.JPopupMenupopMenu=newJPopupMenu();JMenuItemitem;//IftheselectedObjectscollectionisempty,noobjectsareselected.if(tview.getDataBox().getSelectionModel().isEmpty()){popMenu.add("Nothingselected");}else{//Accesstheselectedobjectsfromtheselectionmodel.Iteratorit=tview.getDataBox().getSelectionModel().selection();while(it.hasNext()){Elementelement=(Element)it.next();popMenu.add(element.getName());}}//Ifmenuisempty,returnnull.if(popMenu.getComponentCount()==0){returnnull;}else{returnpopMenu;}}};//Setthepop-upmenugeneratorfornetworkcomponentsnetwork.setPopupMenuGenerator(popupMenuGenerator);}}注意:菜单生成器一旦创建,可以通过方法setPopupMenuGenerator应用在多个图形组件上。例如,上述popupMenuGenerator可以被同时设置在tree上面或表格上面。这样,无论在tree、table、拓扑图上,只要选中同样的数据,点击右键弹出的菜单将是完全一模一样的,而且我们无需编写多个菜单生成器。添加鼠标和键盘动作拓扑图是JavaSwing组件的扩展。和其他Swing组件一样,在Network上添加鼠标、键盘动作是很容易的。唯一需要注意的一点是,拓扑图并非一个简单JComponent那么简单,它由工具条、滚动窗、画布等部分组成。所以,实际上我们一般添加动作都是针对画布的,而不是Network本身。所以,要使用network.getCanvas()方法先获得画布对象。然后,就可以像其他Swing组件那样添加各种监听器了。为了演示,我们在例子中添加一个双击动作,弹出消息框显示被双击的数据对象。这段代码被封装在函数step5中。privatevoidstep5(){network.getCanvas().addMouseListener(newMouseAdapter(){publicvoidmouseClicked(MouseEvente){if(e.getClickCount()==2){//gettheelementthemouseclicked.Elementelement=network.getElementPhysicalAt(e.getPoint());Stringmessage;if(element==null){message="Youclickednothing.";}else{message="Youclicked'"+element.getName()+"'";}JOptionPane.showMessageDialog(network,message);}}});}运行程序如下图。双击空白区和双击对象,都会弹出消息。此外,为了方便开发者对鼠标事件进行更直观的监听,TWaver添加了很多经过封装的鼠标监听方法:TNetwork.addElementDoubleClickedActionListener:添加Element双击事件监听器。TNetwork.addBackgroundDoubleClickedActionListener:添加空白区域双击事件监听器。TNetwork.addElementClickedActionListener:添加Element单击事件监听器。通过这些高度封装的方法,监听鼠标事件就更加方便了。处理数据选择这一节将介绍如下内容:控制选择;监听选择变化;移动拓扑图以便选中数据处于可见位置;由于选择容器是DataBox的一个组成部分,所以所有共享同一个DataBox的图形组件也共享同一套数据选择状态。也就是说,一个对象被选择,是在数据层决定的,它在所有与DataBox相连的图形组件上都会体现出来。如果对选择变化进行监听,则从DataBox的选择容器进行加装监听器。每次选择发生变化,事件会被发送到所有监听器。我们可以在监听器中写代码执行各种任务。为了展示这个功能,我们创建一个监听器,当用户从tree选择一个数据后,拓扑图也会显示选中数据,并且如果这个选中的数据不在可见区域内,会自动滚动画布以保证数据处于可见视野内。这部分代码被封装在step6函数中。privatevoidstep6(){//createaselectionlistener.DataBoxSelectionListenerlistener=newDataBoxSelectionListener(){publicvoidselectionChanged(DataBoxSelectionEvente){//getthelastselectedelementandmakeitvisible.Elementelement=e.getBoxSelectionModel().lastElement();if(element!=null){network.ensureVisible(element);}}};box.getSelectionModel().addDataBoxSelectionListener(listener);}无选中一个数据从tree被选中添加告警这一节介绍如何在数据上使用告警。TWaver提供了综合、全面、强大的告警支持,以简化电信管理软件的开发复杂度。TWaver提供了许多关于告警方面的图形渲染属性,用于控制告警的呈现。当告警发生后,对应的数据就会以相应的方式进行绘制和渲染,以便用直观、易于理解的方式提醒用户。每一个Element对象都有一个告警状态表AlarmState。这是一个告警信息表,记录了所有发生在Element上面的告警信息。要为数据添加告警,首先要获得告警状态表,然后在其中添加告警信息即可。数据会在拓扑图、树等图形组件上做出相应的显示变化。另外,还可以使用DataBox提供的告警传播机制。TWaver默认提供了一个功能完善的告警传播器,可以将告警沿着父对象的路径进行传播。也可以编写符合自己业务规则的告警传播器,设置在DataBox上使用。这里,我们对前面创建的数据添加一些告警,代码被封装在step7函数中。privatevoidstep7(){//createandsetasummingpropagatortothedatasource,//herewillmaketheboxpropagatealarmstoitsparent.box.setAlarmPropagator(newSummingAlarmPropagator());//getaportintheequipmentrack.PortnodeA=(Port)box.getElementByID("0:0");AlarmStatealarmState=nodeA.getAlarmState();//addanacknowledgedalarmwithcriticalseverity.alarmState.addAcknowledgeAlarm(AlarmSeverity.CRITICAL);//addandnewalarmwithmajorseverity.alarmState.addNewAlarm(AlarmSeverity.MAJOR);//getanotherport.PortnodeB=(Port)box.getElementByID("3:3");alarmState=nodeB.getAlarmState();//add10newalarmswithcriticalminor.alarmState.increaseNewAlarm(AlarmSeverity.MINOR,10);}上图显示了告警传播的路径。从树、拓扑图上都可以显示出告警的传播方式、告警传播后的呈现方法。更多关于使用告警的介绍,在后续章节有详细描述。添加装饰图标TWaver支持在各种数据对象上附着显示一些动态图标,用来表示一些动态的网络事件信息。例如,一个设备出了告警之外,还有一些其他并不像告警那么严重的时间信息,这些信息也需要用一种非常直观、醒目的方式显示出来提示用户。这种情况下,可以使用Attachment附件机制。装饰图标就是一种附件,它用一个小图标来表示某些事件的发生,并显示在对应的宿主对象边缘,用于显示一些网络上发生的动态事件和信息。TWaver默认提供了一些预定义的装饰图标,可以直接使用。这些都被IconAttachmentHolder类进行统一管理。扩展新的装饰图标也很简单。我们通过代码进行演示如何操作。首先,我们需要一个小图标:,然后我们定义一个新的装饰图标并进行注册,然后让它显示在某一个Element上面。装饰图标从IconAttachment进行继承,我们重载构造函数,指定我们的图标即可。新的装饰图标需要是一个顶级类,我们推荐用publicstatic来定义,或者放入单独的一个文件中TUIManager.registerAttachment方法进行注册,这样在运行过程中,就可以用element.addAttachment方法显示装饰图标了。这段代码被封装为step8://defineanewLayoutedIconAttachment.//Itmustdefineaspublicstaticclass.publicstaticclassMyIconAttachmentextendsIconAttachment{publicMyIconAttachment(Stringname,ElementUIui){super(name,ui,TWaverUtil.getImageIcon("myIcon.png"));}}privatevoidstep8(){StringiconName="document";TUIManager.registerAttachment(iconName,MyIconAttachment.class);//puta"document"icononelementB.Elementelement=box.g
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论