TWaver基本編程提要_第1頁(yè)
TWaver基本編程提要_第2頁(yè)
TWaver基本編程提要_第3頁(yè)
TWaver基本編程提要_第4頁(yè)
TWaver基本編程提要_第5頁(yè)
已閱讀5頁(yè),還剩11頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

TWaver基本編程2Element的選中機(jī)制所有的Element數(shù)據(jù)都可以被選中。選中狀態(tài)是Element的重要狀態(tài)之一,它在實(shí)現(xiàn)人機(jī)交互過(guò)程中非常常用。理解和使用Element選擇,對(duì)于熟練掌握TWaver開(kāi)發(fā)具有重要意義。使用選擇狀態(tài)所有TWaver的Element都有一個(gè)選中狀態(tài)。要么選中,要么沒(méi)選中,它是一個(gè)boolean值??梢允褂煤瘮?shù)isSelected/setSelected進(jìn)行獲取或設(shè)置。一個(gè)對(duì)象處于選中狀態(tài)時(shí),其外觀會(huì)有一定的變化,對(duì)于不同的組件,這種變化也有所不同。例如,對(duì)于拓?fù)鋱D組件來(lái)說(shuō),選中的數(shù)據(jù)會(huì)顯示一個(gè)高亮外框,而對(duì)于樹(shù)來(lái)說(shuō),選中數(shù)據(jù)會(huì)有一個(gè)高亮的背景框。如下圖。實(shí)際上,這些默認(rèn)的外觀和行為都可以被定制和修改。后續(xù)章節(jié)我們將講述這些用法。使用選擇容器SelectionModelSelectionModel可以成為選擇容器,是一個(gè)DataBox附屬的一個(gè)容器,它維護(hù)著DataBox中所有的被選中的數(shù)據(jù)對(duì)象的引用。DataBox作為一個(gè)大容器,它負(fù)責(zé)所有容納其中數(shù)據(jù)的管理。但是,為了讓管理職責(zé)更加清晰和明確、易于使用,DataBox還拆分出一些附屬的、相對(duì)獨(dú)立的小容器,分管不同的任務(wù)。選擇容器SelectionModel就是其中一個(gè),專門負(fù)責(zé)管理數(shù)據(jù)的選中狀態(tài)。其實(shí),Element已經(jīng)有了boolean值標(biāo)識(shí)選中狀態(tài),那為何DataBox還要設(shè)置選擇容器進(jìn)行選中狀態(tài)的管理呢?主要是為了開(kāi)發(fā)者使用更加方便。舉一個(gè)簡(jiǎn)單的例子:如果DataBox容納了1萬(wàn)個(gè)節(jié)點(diǎn),其中有10個(gè)被用戶選中,并進(jìn)行了"刪除"操作。如果沒(méi)有選擇容器,我們只能通過(guò)遍歷這1萬(wàn)個(gè)節(jié)點(diǎn)來(lái)獲得這10個(gè)數(shù)據(jù)進(jìn)行刪除,效率和方便性上都不夠好。而有了選擇容器,則可以直接訪問(wèn)選擇容器,將其中的10個(gè)節(jié)點(diǎn)刪除即可,因?yàn)門Waver已經(jīng)保證所有的選中節(jié)點(diǎn)都會(huì)出現(xiàn)在選擇容器中。通過(guò)選擇容器,還可以通過(guò)API對(duì)選擇狀態(tài)進(jìn)行控制。例如,將數(shù)據(jù)加入選擇容器會(huì)造成數(shù)據(jù)被選中;清空選擇容器,會(huì)取消所有數(shù)據(jù)的選中狀態(tài),等等。當(dāng)然,選擇容器僅僅負(fù)責(zé)選擇狀態(tài)的管理。無(wú)論對(duì)這個(gè)容器怎么增、刪、改操作,它僅僅影響數(shù)據(jù)的選中狀態(tài),而不會(huì)影響數(shù)據(jù)的其他屬性,更不會(huì)導(dǎo)致數(shù)據(jù)從DataBox中被刪除等行為。使用選擇監(jiān)聽(tīng)器設(shè)置右鍵菜單右鍵菜單也成為彈出菜單,本章介紹如何在拓?fù)鋱D以及其他圖形組件中使用右鍵菜單。右鍵菜單是一個(gè)非常常用的交互方法,通過(guò)對(duì)數(shù)據(jù)進(jìn)行選擇、右鍵菜單,可以快速調(diào)出上下文有關(guān)的操作選項(xiàng),為軟件使用者提供直觀的交互方法。TWaver中,我們使用一個(gè)叫做彈出菜單生成器(PopupMenuGenerator)的接口,來(lái)制作各種不同的右鍵菜單。更多關(guān)于使用右鍵菜單的例子,請(qǐng)見(jiàn)后續(xù)章節(jié)。這里僅給出一個(gè)簡(jiǎn)單的例子,讓讀者了解彈出菜單是如何制作出來(lái)的。菜單生成器是一個(gè)接口,被設(shè)置在拓?fù)鋱D或其他圖形組件上。一旦設(shè)置,當(dāng)鼠標(biāo)右鍵點(diǎn)擊圖形組件時(shí),TWaver就會(huì)回調(diào)這個(gè)接口獲得右鍵菜單。TWaver會(huì)將當(dāng)前的一些操作場(chǎng)景傳入,例如被點(diǎn)擊的圖形組件、鼠標(biāo)事件等等。我們要做的,就是根據(jù)這些信息,動(dòng)態(tài)的生成需要的右鍵菜單,返回即可。具體的菜單顯示等細(xì)節(jié),TWaver會(huì)幫我們完成。以下彈出菜單的例子彈出一個(gè)菜單,把所有的選中的對(duì)象的名字用菜單項(xiàng)顯示出來(lái)。代碼被封裝在函數(shù)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);}}注意:菜單生成器一旦創(chuàng)建,可以通過(guò)方法setPopupMenuGenerator應(yīng)用在多個(gè)圖形組件上。例如,上述popupMenuGenerator可以被同時(shí)設(shè)置在tree上面或表格上面。這樣,無(wú)論在tree、table、拓?fù)鋱D上,只要選中同樣的數(shù)據(jù),點(diǎn)擊右鍵彈出的菜單將是完全一模一樣的,而且我們無(wú)需編寫多個(gè)菜單生成器。添加鼠標(biāo)和鍵盤動(dòng)作拓?fù)鋱D是JavaSwing組件的擴(kuò)展。和其他Swing組件一樣,在Network上添加鼠標(biāo)、鍵盤動(dòng)作是很容易的。唯一需要注意的一點(diǎn)是,拓?fù)鋱D并非一個(gè)簡(jiǎn)單JComponent那么簡(jiǎn)單,它由工具條、滾動(dòng)窗、畫布等部分組成。所以,實(shí)際上我們一般添加動(dòng)作都是針對(duì)畫布的,而不是Network本身。所以,要使用network.getCanvas()方法先獲得畫布對(duì)象。然后,就可以像其他Swing組件那樣添加各種監(jiān)聽(tīng)器了。為了演示,我們?cè)诶又刑砑右粋€(gè)雙擊動(dòng)作,彈出消息框顯示被雙擊的數(shù)據(jù)對(duì)象。這段代碼被封裝在函數(shù)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);}}});}運(yùn)行程序如下圖。雙擊空白區(qū)和雙擊對(duì)象,都會(huì)彈出消息。此外,為了方便開(kāi)發(fā)者對(duì)鼠標(biāo)事件進(jìn)行更直觀的監(jiān)聽(tīng),TWaver添加了很多經(jīng)過(guò)封裝的鼠標(biāo)監(jiān)聽(tīng)方法:TNetwork.addElementDoubleClickedActionListener:添加Element雙擊事件監(jiān)聽(tīng)器。TNetwork.addBackgroundDoubleClickedActionListener:添加空白區(qū)域雙擊事件監(jiān)聽(tīng)器。TNetwork.addElementClickedActionListener:添加Element單擊事件監(jiān)聽(tīng)器。通過(guò)這些高度封裝的方法,監(jiān)聽(tīng)鼠標(biāo)事件就更加方便了。處理數(shù)據(jù)選擇這一節(jié)將介紹如下內(nèi)容:控制選擇;監(jiān)聽(tīng)選擇變化;移動(dòng)拓?fù)鋱D以便選中數(shù)據(jù)處于可見(jiàn)位置;由于選擇容器是DataBox的一個(gè)組成部分,所以所有共享同一個(gè)DataBox的圖形組件也共享同一套數(shù)據(jù)選擇狀態(tài)。也就是說(shuō),一個(gè)對(duì)象被選擇,是在數(shù)據(jù)層決定的,它在所有與DataBox相連的圖形組件上都會(huì)體現(xiàn)出來(lái)。如果對(duì)選擇變化進(jìn)行監(jiān)聽(tīng),則從DataBox的選擇容器進(jìn)行加裝監(jiān)聽(tīng)器。每次選擇發(fā)生變化,事件會(huì)被發(fā)送到所有監(jiān)聽(tīng)器。我們可以在監(jiān)聽(tīng)器中寫代碼執(zhí)行各種任務(wù)。為了展示這個(gè)功能,我們創(chuàng)建一個(gè)監(jiān)聽(tīng)器,當(dāng)用戶從tree選擇一個(gè)數(shù)據(jù)后,拓?fù)鋱D也會(huì)顯示選中數(shù)據(jù),并且如果這個(gè)選中的數(shù)據(jù)不在可見(jiàn)區(qū)域內(nèi),會(huì)自動(dòng)滾動(dòng)畫布以保證數(shù)據(jù)處于可見(jiàn)視野內(nèi)。這部分代碼被封裝在step6函數(shù)中。privatevoidstep6(){//createaselectionlistener.DataBoxSelectionListenerlistener=newDataBoxSelectionListener(){publicvoidselectionChanged(DataBoxSelectionEvente){//getthelastselectedelementandmakeitvisible.Elementelement=e.getBoxSelectionModel().lastElement();if(element!=null){network.ensureVisible(element);}}};box.getSelectionModel().addDataBoxSelectionListener(listener);}無(wú)選中一個(gè)數(shù)據(jù)從tree被選中添加告警這一節(jié)介紹如何在數(shù)據(jù)上使用告警。TWaver提供了綜合、全面、強(qiáng)大的告警支持,以簡(jiǎn)化電信管理軟件的開(kāi)發(fā)復(fù)雜度。TWaver提供了許多關(guān)于告警方面的圖形渲染屬性,用于控制告警的呈現(xiàn)。當(dāng)告警發(fā)生后,對(duì)應(yīng)的數(shù)據(jù)就會(huì)以相應(yīng)的方式進(jìn)行繪制和渲染,以便用直觀、易于理解的方式提醒用戶。每一個(gè)Element對(duì)象都有一個(gè)告警狀態(tài)表AlarmState。這是一個(gè)告警信息表,記錄了所有發(fā)生在Element上面的告警信息。要為數(shù)據(jù)添加告警,首先要獲得告警狀態(tài)表,然后在其中添加告警信息即可。數(shù)據(jù)會(huì)在拓?fù)鋱D、樹(shù)等圖形組件上做出相應(yīng)的顯示變化。另外,還可以使用DataBox提供的告警傳播機(jī)制。TWaver默認(rèn)提供了一個(gè)功能完善的告警傳播器,可以將告警沿著父對(duì)象的路徑進(jìn)行傳播。也可以編寫符合自己業(yè)務(wù)規(guī)則的告警傳播器,設(shè)置在DataBox上使用。這里,我們對(duì)前面創(chuàng)建的數(shù)據(jù)添加一些告警,代碼被封裝在step7函數(shù)中。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);}上圖顯示了告警傳播的路徑。從樹(shù)、拓?fù)鋱D上都可以顯示出告警的傳播方式、告警傳播后的呈現(xiàn)方法。更多關(guān)于使用告警的介紹,在后續(xù)章節(jié)有詳細(xì)描述。添加裝飾圖標(biāo)TWaver支持在各種數(shù)據(jù)對(duì)象上附著顯示一些動(dòng)態(tài)圖標(biāo),用來(lái)表示一些動(dòng)態(tài)的網(wǎng)絡(luò)事件信息。例如,一個(gè)設(shè)備出了告警之外,還有一些其他并不像告警那么嚴(yán)重的時(shí)間信息,這些信息也需要用一種非常直觀、醒目的方式顯示出來(lái)提示用戶。這種情況下,可以使用Attachment附件機(jī)制。裝飾圖標(biāo)就是一種附件,它用一個(gè)小圖標(biāo)來(lái)表示某些事件的發(fā)生,并顯示在對(duì)應(yīng)的宿主對(duì)象邊緣,用于顯示一些網(wǎng)絡(luò)上發(fā)生的動(dòng)態(tài)事件和信息。TWaver默認(rèn)提供了一些預(yù)定義的裝飾圖標(biāo),可以直接使用。這些都被IconAttachmentHolder類進(jìn)行統(tǒng)一管理。擴(kuò)展新的裝飾圖標(biāo)也很簡(jiǎn)單。我們通過(guò)代碼進(jìn)行演示如何操作。首先,我們需要一個(gè)小圖標(biāo):,然后我們定義一個(gè)新的裝飾圖標(biāo)并進(jìn)行注冊(cè),然后讓它顯示在某一個(gè)Element上面。裝飾圖標(biāo)從IconAttachment進(jìn)行繼承,我們重載構(gòu)造函數(shù),指定我們的圖標(biāo)即可。新的裝飾圖標(biāo)需要是一個(gè)頂級(jí)類,我們推薦用publicstatic來(lái)定義,或者放入單獨(dú)的一個(gè)文件中TUIManager.registerAttachment方法進(jìn)行注冊(cè),這樣在運(yùn)行過(guò)程中,就可以用element.addAttachment方法顯示裝飾圖標(biāo)了。這段代碼被封裝為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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論