往eclipse的默認(rèn)NavigationView中,添加右鍵菜單項(xiàng)是非常容易的,甚至不需要自己寫代碼,只要在plugin.xml中添加擴(kuò)展項(xiàng)便可以了。
          但是這遠(yuǎn)遠(yuǎn)達(dá)不到我們的要求。如果要我們?cè)谧约旱膔cp程序的View中添加右鍵彈出菜單就不是很容易了。現(xiàn)在我介紹一下如何在一個(gè)樹視圖中針對(duì)不同的TreeObject添加不同的右鍵彈出菜單的方法。
          如果不清楚如何構(gòu)建一個(gè)樹,請(qǐng)參考
          http://www.java2s.com/Code/Java/SWT-JFace-Eclipse/CatalogSWT-JFace-Eclipse.htm, 這里有很多關(guān)于eclipse Tree的實(shí)例。簡單將來,Eclipse中創(chuàng)建樹有兩種,一種是使用SWT提供的樹,依照一定的格式給其提供數(shù)據(jù),我自己只用這種方法創(chuàng)建一些簡單的、靜態(tài)的樹。另一種方法,針對(duì)于RCP程序,可以使用JFace提供的TreeViewer類,非常靈活并且易于擴(kuò)展。使用TreeViewer需要實(shí)現(xiàn)ITreeContentProvider接口和ITreeLableProvider接口。由于我的時(shí)間有限,不能向大家提供具體的實(shí)現(xiàn)方法,請(qǐng)?jiān)彙?梢詤⒖家韵挛恼拢?/FONT>http://eclipse.org/articles/treeviewer-cg/TreeViewerArticle.htm
          在大體了解了如何構(gòu)造一個(gè)樹之后,我們下面就來介紹右鍵彈出菜單context menu的實(shí)現(xiàn)方法。
          一個(gè)TreeViewer 必須繼承ViewPart方法,并且重寫其中的createPartControl(Composite parent)類。


             public void createPartControl(Composite parent) {

             /* Set the imput data and image model of the tree viewer,
              * and layout the viewer on the left part of the composite.
              */
              viewer = new TreeViewer(parent);
              viewer.setContentProvider(new ViewContentProvider());
              viewer.setLabelProvider(new ViewLabelProvider());
              viewer.setInput(createDummyModel());
          10
          11   createActions();
          12   createMenus();
          13   createContextMenu(parent);
          14
          15   //handles the actions related with treeviewer.
          16   makeActions(parent);
          17 }
          其中,第7到9行為設(shè)置TreeViewer的內(nèi)容提供器、圖像提供器、以及初始化時(shí)的輸入數(shù)據(jù)。第13行為創(chuàng)建右鍵彈出菜單。

          1     private void createContextMenu(Composite parent) {

          3         MenuManager mgr = new MenuManager();
          4         mgr.setRemoveAllWhenShown(true);
          5         mgr.addMenuListener(new IMenuListener() {
          6             public void menuAboutToShow(IMenuManager manager) {
          7                fillContextMenu(manager);
          8             }
          9         });
          10     Menu menu = mgr.createContextMenu(viewer.getControl());
          11     viewer.getControl().setMenu(menu);
          12     getSite().registerContextMenu(mgr, viewer);
          13   }
          第4行代碼中,setRemoveAllWhenShown(true)的作用是清空以前顯示的菜單項(xiàng),當(dāng)觸發(fā)了menu事件時(shí),重新填充(fillContextMenu),所以如果不把removeAllWhenShow置為true的話,每點(diǎn)一下右鍵你就會(huì)看到菜單項(xiàng)多出一倍來。Menu是swt的控件,而Menumanager是Jface中的控件,不象SWT那樣直接同底層打交道。用MenuManager可以創(chuàng)建出一個(gè)Menu對(duì)象。第十行mgr.createContextMenu(viewer.getControl());這里的viewer即為上面的viewer。第十一行,然后我們將樹的setMenu方法將樹控件與Menu控件聯(lián)系在一起就好了。
          最重要的是第十二行,這是context menu能不能顯示的關(guān)鍵。一個(gè)視圖中可以有多個(gè)context menu, 而每一個(gè)context menu都必須注冊(cè)給workbench。這需要通過調(diào)用
          org.eclipse.ui.IWorkbenchPartSite.registerContextMenu(MenuManager menuManager, ISelectionProvider selectionProvider)或者(當(dāng)有多個(gè)注冊(cè)的context menu時(shí))org.eclipse.ui.IWorkbenchPartSite.registerContextMenu(String menuId, MenuManager menuManager, ISelectionProvider selectionProvider) 增加的參數(shù)menuId用于區(qū)分不同的context menu。
          接下來,我們有兩種方法來創(chuàng)建右鍵彈出菜單項(xiàng)。第一種,實(shí)現(xiàn)fillContextMenu()方法。典型的實(shí)現(xiàn)代碼如下:
          1     protected void fillContextMenu(IMenuManager manager) {
          2  
          3         manager.add(openAction);
          4         manager.add(removeAction);
          5         manager.add(addAction);
          6              } 

          這些Action都可由自己定義創(chuàng)建。
          另外的方法,可以編輯plugin.xml文件。不需要自己寫任何代碼便可以顯示出自己想要的彈出項(xiàng)。
          這次先講到這里,下次介紹另外的一種實(shí)現(xiàn)方式。(主要是由于剛創(chuàng)建Blog,不知道如何插入圖片,這么寫太費(fèi)勁也太枯燥了,相信大家一定不能忍了吧!咱們下次再見

          Feedback

          # re: 往Eclipse RCP視圖中添加右鍵彈出菜單(一)  回復(fù)  更多評(píng)論   

          2006-01-06 17:46 by 愿做魚
          親愛的,我們還急著要看(二)

          # re: 往Eclipse RCP視圖中添加右鍵彈出菜單(一)  回復(fù)  更多評(píng)論   

          2006-01-06 18:10 by nemo
          對(duì)不起,最近實(shí)在太忙了,忙著做開題報(bào)告。
          最早也要到兩周后了。
          有一些相關(guān)的例子你可以先看一下,雖是英語的,可還是很容易讀懂。一直沒寫下去的一部分原因也是看到這篇文章,覺得不太有必要寫了。
          http://www.eclipse.org/articles/Article-action-contribution/Contributing%20Actions%20to%20the%20Eclipse%20Workbench.html

          # 如何針對(duì)TreeViewer不同的TreeObject添加不同的右鍵彈出菜單  回復(fù)  更多評(píng)論   

          2006-01-10 10:37 by 想不出問題的我
          如何針對(duì)TreeViewer上不同的TreeObject添加不同的右鍵彈出菜單

          # re: 往Eclipse RCP視圖中添加右鍵彈出菜單(一)  回復(fù)  更多評(píng)論   

          2006-01-10 13:30 by nemo
          可以通過填寫plugin.xml來進(jìn)行操作。通過設(shè)置filter,典型格式如下:
          <extension point="org.eclipse.ui.popupMenus">
          <objectContribution id="org.eclipse.ui.articles.action.contribution.popup.object"
          objectClass="org.eclipse.core.resources.IFile"
          nameFilter="*.java">
          <filter
          name="projectNature"
          value="org.eclipse.jdt.core.javanature">
          </filter>
          <action id="org.eclipse.ui.articles.action.contribution.object.action1"
          label="Object Action 1"
          icon="icons/red_dot.gif"
          menubarPath="additions"
          class="org.eclipse.ui.articles.action.contribution.ObjectAction1Delegate">
          </action>
          </objectContribution>
          </extension>

          此處objectClass設(shè)為你為你的TreeViewer設(shè)置的樹對(duì)象類。nameFilter可以精確指定哪一個(gè)樹對(duì)象(顯示的名字)。
          action標(biāo)簽設(shè)置你想要處理的事件操作,必須實(shí)現(xiàn)org.eclipse.ui.IObjectActionDelegate接口(讓Eclipse自動(dòng)完成),只要在其中實(shí)現(xiàn)run()方法,寫出自己想要的操作即可。我印象中是這樣的。
          另外的方法你可以在createContextMenu中針對(duì)不同的TreeObject對(duì)象(通過viewer.getTree().getSelection()[0].getText()獲知當(dāng)前選擇的樹對(duì)象)構(gòu)造不同的響應(yīng)方法(用判斷語句)。
          關(guān)于第一種方法,上面給出的那個(gè)鏈接中有比較詳細(xì)的說明,可以參考。
          比較忙,有不明白的地方請(qǐng)包涵。也可以再提出來。有空時(shí)我會(huì)回復(fù)的。

          # re: 往Eclipse RCP視圖中添加右鍵彈出菜單(一)  回復(fù)  更多評(píng)論   

          2006-02-28 14:13 by nemo
          @想不出問題的我
          可以設(shè)置nameFilter過濾樹結(jié)點(diǎn)的名字。
          比如對(duì)于文件結(jié)點(diǎn)而言,可根據(jù)文件的后綴名辨別不同的樹結(jié)點(diǎn),從而針對(duì)不同類型的文件設(shè)置不同的ContextMenu.

          # re: 往Eclipse RCP視圖中添加右鍵彈出菜單(一)  回復(fù)  更多評(píng)論   

          2006-03-10 15:53 by 傲起
          怎樣在TreeViewer中顯示根節(jié)點(diǎn)阿?

          # re: 往Eclipse RCP視圖中添加右鍵彈出菜單(一)  回復(fù)  更多評(píng)論   

          2006-03-28 10:36 by sol
          小弟最近也在學(xué)習(xí)RCP樹是建立起來了但是在建立多層的時(shí)候遇到刷新不夠及時(shí)的問題.困擾了我?guī)滋炝?忘大蝦指條路~








          `

          # re: 往Eclipse RCP視圖中添加右鍵彈出菜單(一)  回復(fù)  更多評(píng)論   

          2006-03-28 15:44 by nemo
          我這里沒有用別的方法,只調(diào)用viewer.refresh()方法。是不是監(jiān)聽機(jī)制出現(xiàn)了問題?

          # re: 往Eclipse RCP視圖中添加右鍵彈出菜單(一)  回復(fù)  更多評(píng)論   

          2006-04-06 14:16 by nemo
          @sol
          這兩天我又研究了一下關(guān)于刷新不及時(shí)的問題,有了一些答案。
          建議不要使用refresh(void)方法。refresh(void)方法只有在大規(guī)模數(shù)據(jù)變動(dòng)的情況下在使用,否則會(huì)延緩刷新。
          viewer.refresh()會(huì)遞歸的更新所有樹節(jié)點(diǎn)object,以及l(fā)abel和content,在這個(gè)過程中需要與樹結(jié)構(gòu),標(biāo)簽提供器以及內(nèi)容提供器緊密的交互,因而在出現(xiàn)較少數(shù)據(jù)變更時(shí)沒有必要也不應(yīng)該使用刷新方法。
          還有另一個(gè)版本的刷新方法,可以用它來指定是否刷新現(xiàn)有元素的標(biāo)簽。建議使用刷新方法時(shí)不要使用viewer.refresh(),而使用viewer.refresh(boolean updateLabels)、viewer.refresh(Object element)、viewer.refresh(Object element,boolean updateLabels)
          而update方法之刷新所選目標(biāo)的label或是圖像,而不管其子節(jié)點(diǎn)。如果該節(jié)點(diǎn)下新增加了一個(gè)子節(jié)點(diǎn),調(diào)用update方法之后不會(huì)顯示出來.
          如果加載的數(shù)據(jù)過多,可新開一線程。

          # re: 往Eclipse RCP視圖中添加右鍵彈出菜單(一)  回復(fù)  更多評(píng)論   

          2006-06-21 14:00 by 墓地守望者
          我在系統(tǒng)托盤中加入彈出菜單,為什么不能顯示
          private void hookPopupMenu(final IWorkbenchWindow window) {
          trayItem.addListener(SWT.MenuDetect, new Listener() {
          public void handleEvent(Event event) {
          MenuManager trayMenu = new MenuManager();
          Menu menu = trayMenu.createContextMenu(window.getShell());
          actionBarAdvisor.fillTrayItem(trayMenu);
          menu.setVisible(true);
          }
          });
          }

          # re: 往Eclipse RCP視圖中添加右鍵彈出菜單(一)  回復(fù)  更多評(píng)論   

          2006-06-25 20:24 by 一只不愿游泳的魚
          我也是一只不愿游泳的魚,呵呵

          # re: 往Eclipse RCP視圖中添加右鍵彈出菜單(一)  回復(fù)  更多評(píng)論   

          2006-07-15 02:20 by nemo
          對(duì)不起大家啊,這段時(shí)間一直沒有來得及管理博客。在忙畢設(shè)。現(xiàn)在可以歇一歇了。
          如果要在上下文菜單里添加多極菜單的話,需要加入菜單分隔線,否則系統(tǒng)就會(huì)警告。
          menuManager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));

          posts - 21, comments - 74, trackbacks - 0, articles - 3

          Copyright © nemo

          主站蜘蛛池模板: 福鼎市| 保德县| 昌平区| 永靖县| 沈阳市| 化德县| 喀什市| 平邑县| 伊吾县| 曲阜市| 顺平县| 通江县| 温泉县| 高台县| 安化县| 湘潭县| 腾冲县| 云林县| 山西省| 建平县| 张北县| 乃东县| 漳浦县| 高青县| 沿河| 贵州省| 化州市| 桐柏县| 青阳县| 应用必备| 文山县| 长海县| 东兴市| 大理市| 扶余县| 阳谷县| 理塘县| 灵武市| 佛教| 江阴市| 晋宁县|