<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    往eclipse的默認NavigationView中,添加右鍵菜單項是非常容易的,甚至不需要自己寫代碼,只要在plugin.xml中添加擴展項便可以了。
    但是這遠遠達不到我們的要求。如果要我們在自己的rcp程序的View中添加右鍵彈出菜單就不是很容易了?,F在我介紹一下如何在一個樹視圖中針對不同的TreeObject添加不同的右鍵彈出菜單的方法。
    如果不清楚如何構建一個樹,請參考
    http://www.java2s.com/Code/Java/SWT-JFace-Eclipse/CatalogSWT-JFace-Eclipse.htm, 這里有很多關于eclipse Tree的實例。簡單將來,Eclipse中創建樹有兩種,一種是使用SWT提供的樹,依照一定的格式給其提供數據,我自己只用這種方法創建一些簡單的、靜態的樹。另一種方法,針對于RCP程序,可以使用JFace提供的TreeViewer類,非常靈活并且易于擴展。使用TreeViewer需要實現ITreeContentProvider接口和ITreeLableProvider接口。由于我的時間有限,不能向大家提供具體的實現方法,請原諒??梢詤⒖家韵挛恼拢?/FONT>http://eclipse.org/articles/treeviewer-cg/TreeViewerArticle.htm
    在大體了解了如何構造一個樹之后,我們下面就來介紹右鍵彈出菜單context menu的實現方法。
    一個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行為設置TreeViewer的內容提供器、圖像提供器、以及初始化時的輸入數據。第13行為創建右鍵彈出菜單。

    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)的作用是清空以前顯示的菜單項,當觸發了menu事件時,重新填充(fillContextMenu),所以如果不把removeAllWhenShow置為true的話,每點一下右鍵你就會看到菜單項多出一倍來。Menu是swt的控件,而Menumanager是Jface中的控件,不象SWT那樣直接同底層打交道。用MenuManager可以創建出一個Menu對象。第十行mgr.createContextMenu(viewer.getControl());這里的viewer即為上面的viewer。第十一行,然后我們將樹的setMenu方法將樹控件與Menu控件聯系在一起就好了。
    最重要的是第十二行,這是context menu能不能顯示的關鍵。一個視圖中可以有多個context menu, 而每一個context menu都必須注冊給workbench。這需要通過調用
    org.eclipse.ui.IWorkbenchPartSite.registerContextMenu(MenuManager menuManager, ISelectionProvider selectionProvider)或者(當有多個注冊的context menu時)org.eclipse.ui.IWorkbenchPartSite.registerContextMenu(String menuId, MenuManager menuManager, ISelectionProvider selectionProvider) 增加的參數menuId用于區分不同的context menu。
    接下來,我們有兩種方法來創建右鍵彈出菜單項。第一種,實現fillContextMenu()方法。典型的實現代碼如下:
    1     protected void fillContextMenu(IMenuManager manager) {
    2  
    3         manager.add(openAction);
    4         manager.add(removeAction);
    5         manager.add(addAction);
    6              } 

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

    Feedback

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

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

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

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

    # 如何針對TreeViewer不同的TreeObject添加不同的右鍵彈出菜單  回復  更多評論   

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

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

    2006-01-10 13:30 by nemo
    可以通過填寫plugin.xml來進行操作。通過設置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設為你為你的TreeViewer設置的樹對象類。nameFilter可以精確指定哪一個樹對象(顯示的名字)。
    action標簽設置你想要處理的事件操作,必須實現org.eclipse.ui.IObjectActionDelegate接口(讓Eclipse自動完成),只要在其中實現run()方法,寫出自己想要的操作即可。我印象中是這樣的。
    另外的方法你可以在createContextMenu中針對不同的TreeObject對象(通過viewer.getTree().getSelection()[0].getText()獲知當前選擇的樹對象)構造不同的響應方法(用判斷語句)。
    關于第一種方法,上面給出的那個鏈接中有比較詳細的說明,可以參考。
    比較忙,有不明白的地方請包涵。也可以再提出來。有空時我會回復的。

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

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

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

    2006-03-10 15:53 by 傲起
    怎樣在TreeViewer中顯示根節點阿?

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

    2006-03-28 10:36 by sol
    小弟最近也在學習RCP樹是建立起來了但是在建立多層的時候遇到刷新不夠及時的問題.困擾了我幾天了.忘大蝦指條路~








    `

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

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

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

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

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

    2006-06-21 14:00 by 墓地守望者
    我在系統托盤中加入彈出菜單,為什么不能顯示
    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視圖中添加右鍵彈出菜單(一)  回復  更多評論   

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

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

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

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

    Copyright © nemo

    主站蜘蛛池模板: 在线免费观看污网站| 韩国日本好看电影免费看| 91亚洲国产成人久久精品网站| 中文字幕在线观看免费视频| 激情综合亚洲色婷婷五月| 亚洲A∨午夜成人片精品网站| 国产成人在线免费观看| 在线看片免费人成视频久网下载 | 亚洲精品国产免费| 亚洲欧美日韩综合久久久| 亚洲伊人久久精品影院| 69堂人成无码免费视频果冻传媒| 18禁亚洲深夜福利人口| 亚洲成a人片在线观看中文动漫| 日韩免费无砖专区2020狼| 东方aⅴ免费观看久久av| 日韩亚洲人成在线| 亚洲国产一二三精品无码| 免费无码成人AV片在线在线播放| 大地影院MV在线观看视频免费| 亚洲国产精品无码第一区二区三区| 国产亚洲人成网站在线观看不卡| 在线观看视频免费国语| 无码精品国产一区二区三区免费| 国产精品久久久久久亚洲小说| 亚洲精品欧洲精品| 亚洲精品无码久久一线| 国产免费一区二区三区VR| 3d动漫精品啪啪一区二区免费| 九一在线完整视频免费观看| tom影院亚洲国产一区二区| 国产aⅴ无码专区亚洲av| 国产jizzjizz免费视频| 久久受www免费人成_看片中文| 丁香婷婷亚洲六月综合色| 亚洲AV中文无码字幕色三| 亚洲国产精品专区在线观看| 成年性生交大片免费看| 91精品国产免费入口| 国产精品99精品久久免费| 成人A毛片免费观看网站|