rcp新建工程没有图标的问题解决方案

本文解决Eclipse RCP环境下Java工程图标显示问题,通过注册适配器及声明工作台图标来确保工程图标正常显示。

原文:http://aquariusm.iteye.com/blog/1318708

 

这几天因为北京的项目开展,平台加入了java开发模式,因此工具开始需要支持java工程,但是发现在工具(rcp开发的eclipse开发工具)不能正常显示图标;前边开发的是普通工程没有显示不表是正常的,但是现在没有显示图标就很怪异,因为本身会有一个小J在工程名前边,标示是java工程;但小J左下角正常情况下应该是工程图标的地方,却显示是一个小红方块,很明显是没有找到相应的文件嘛!于是查找了网上的解决方案,这里做一下收集:

 

用到的连接地址:

http://zhaozhongwei.iteye.com/blog/305824

http://www.blogjava.net/USTCEric/archive/2006/01/08/27141.html

 

 

第一篇:

在rcp中(我的环境是eclipse3.4),有的时候需要建立工程,但是默认情况下建立的工程的图片显示不出来(包视图里出现这种情况,别的视图不清楚),这里拿新建java工程举例。

 

在获得图片的时候,程序会调用到 org.eclipse.jdt.internal.ui.viewsupport.JavaElementImageProvider类的 getBaseImageDescriptor方法,在288行(版本不同会有细微差别)有类似如下代码。

 

    case IJavaElement.JAVA_PROJECT: 
     IJavaProject jp= (IJavaProject)element;
     if (jp.getProject().isOpen()) {
      IProject project= jp.getProject();
      IWorkbenchAdapter adapter= (IWorkbenchAdapter)project.getAdapter(IWorkbenchAdapter.class);
      if (adapter != null) {
       ImageDescriptor result= adapter.getImageDescriptor(project);
       if (result != null)
        return result;
      }
      return DESC_OBJ_PROJECT;
     }

。。。

 

如果跟到这里,会发现adapter 的值为null,而正常情况下这个adapter数有值的。

在rcp中生成的ApplicationWorkbenchAdvisor的preWindowOpen方法里面会生成

WorkbenchAdapterBuilder.registerAdapters();

但是我用debug发现在eclipse3.4里面,preWindowOpen方法没被调用,导致 WorkbenchAdapterBuilder.registerAdapters();没被执行,从而导致adapter 的值为null。这样工程的前面没有图片,会出现一小块空白!把 WorkbenchAdapterBuilder.registerAdapters();加到ApplicationWorkbenchAdvisor 类的initialize方法里会解决这个问题,默认不生成initialize方法,所以要重载该方法,如下

 @Override
 public void initialize(IWorkbenchConfigurer configurer) {
  // TODO Auto-generated method stub
  super.initialize(configurer);
  WorkbenchAdapterBuilder.registerAdapters();
 }

 

经过这样的修改后会看到,工程的前面是个红色的图片(没找到对应图片的标志),在这个红图片的右上角有一个J(代表是java工程),这是因为 eclipse调用的是org.eclipse.ui.internal.ide.application.IDEApplication(在 org.eclipse.ui.ide.application插件下),而我们的rcp会调用我们的Application

IDEApplication的start方法代码中有如下代码片段

int returnCode = PlatformUI.createAndRunWorkbench(display,
                    new IDEWorkbenchAdvisor());

 

IDEWorkbenchAdvisor类中的initialize方法会调用

// register shared images
  declareWorkbenchImages();

 

而declareWorkbenchImages个方法就是工程等图片被注册的地方!所以我们要做的就是把 declareWorkbenchImages这个方法里的代码全部复制到我们的ApplicationWorkbenchAdvisor类里,然后在 initialize方法里调用就可以了,因为图片都是在org.eclipse.ui.ide.application插件下,而代码也用到了这个插 件,所以要在依赖里家上这个插件。

 

第二篇:

 自己遇到了这方面问题,在瀚海星云上咨询了一下,解决后总结了一下。现在收录到自己的空间里:)

 前段时间为了使用jdt中的package explorer进行一个rcp程序的开发。在版面上进行了
提问,得到了simon lei,pandawang 的热情帮助,在此表示感谢。经过一番学习,在几个论
坛上问了一下,当时仍没有找到解决方法(主要是使用package explorer时项目和文件
夹的显示问题),又看到rcp的faq中有reusable 的说法就得出不能在rcp中复用jdt组件
的结论。实际上这个结论是错误的,只要提供相关的插件支持是可以重用jdt中组件的,
我再一次重复这个问题是为了避免我那个回帖误导别人。

我在rcp的perspective中用addview加入package explorer是没有问题的,之所以不能显
示项目名称是因为没有注册相关的adapter。

只要在workbenchadvisor中的initialize方法中加入:
WorkbenchAdapterBuilder.registerAdapters();
declareWorkbenchImages();
就可以解决问题。WorkbenchAdapterBuilder是org.eclipse.ui.ide中的类,用
registerAdapters方法注册adapter后就可以正常显示项目名称以及文件夹名称,但是这
时候还不能显示相关的图标。
declareWorkbenchImages()方法用来解决图标的问题。
实现如下:

 

Java代码  收藏代码

  1. /** 
  2.  * Declares all IDE-specific workbench images. This includes both "shared" 
  3.  * images (named in {@link IDE.SharedImages}) and internal images (named in 
  4.  * {@link org.eclipse.ui.internal.ide.IDEInternalWorkbenchImages}). 
  5.  *  
  6.  * @see IWorkbenchConfigurer#declareImage 
  7.  */  
  8. private void declareWorkbenchImages() {  
  9.   
  10.     final String ICONS_PATH = "$nl$/icons/full/";//$NON-NLS-1$  
  11.     final String PATH_ELOCALTOOL = ICONS_PATH + "elcl16/"// Enabled //$NON-NLS-1$  
  12.   
  13.     // toolbar  
  14.     // icons.  
  15.     final String PATH_DLOCALTOOL = ICONS_PATH + "dlcl16/"// Disabled //$NON-NLS-1$  
  16.     // //$NON-NLS-1$  
  17.     // toolbar  
  18.     // icons.  
  19.     final String PATH_ETOOL = ICONS_PATH + "etool16/"// Enabled toolbar //$NON-NLS-1$  
  20.     // //$NON-NLS-1$  
  21.     // icons.  
  22.     final String PATH_DTOOL = ICONS_PATH + "dtool16/"// Disabled toolbar //$NON-NLS-1$  
  23.     // //$NON-NLS-1$  
  24.     // icons.  
  25.     final String PATH_OBJECT = ICONS_PATH + "obj16/"// Model object //$NON-NLS-1$  
  26.     // //$NON-NLS-1$  
  27.     // icons  
  28.     final String PATH_WIZBAN = ICONS_PATH + "wizban/"// Wizard //$NON-NLS-1$  
  29.     // //$NON-NLS-1$  
  30.     // icons  
  31.   
  32.     // View icons  
  33.     final String PATH_EVIEW= ICONS_PATH + "eview16/"//$NON-NLS-1$  
  34.   
  35.   
  36.     Bundle ideBundle = Platform.getBundle(IDEWorkbenchPlugin.IDE_WORKBENCH);  
  37.   
  38.     declareWorkbenchImage(ideBundle,  
  39.             IDEInternalWorkbenchImages.IMG_ETOOL_BUILD_EXEC, PATH_ETOOL  
  40.                     + "build_exec.gif"false); //$NON-NLS-1$  
  41.     declareWorkbenchImage(ideBundle,  
  42.             IDEInternalWorkbenchImages.IMG_ETOOL_BUILD_EXEC_HOVER,  
  43.             PATH_ETOOL + "build_exec.gif"false); //$NON-NLS-1$  
  44.     declareWorkbenchImage(ideBundle,  
  45.             IDEInternalWorkbenchImages.IMG_ETOOL_BUILD_EXEC_DISABLED,  
  46.             PATH_DTOOL + "build_exec.gif"false); //$NON-NLS-1$  
  47.   
  48.     declareWorkbenchImage(ideBundle,  
  49.             IDEInternalWorkbenchImages.IMG_ETOOL_SEARCH_SRC, PATH_ETOOL  
  50.                     + "search_src.gif"false); //$NON-NLS-1$  
  51.     declareWorkbenchImage(ideBundle,  
  52.             IDEInternalWorkbenchImages.IMG_ETOOL_SEARCH_SRC_HOVER,  
  53.             PATH_ETOOL + "search_src.gif"false); //$NON-NLS-1$  
  54.     declareWorkbenchImage(ideBundle,  
  55.             IDEInternalWorkbenchImages.IMG_ETOOL_SEARCH_SRC_DISABLED,  
  56.             PATH_DTOOL + "search_src.gif"false); //$NON-NLS-1$  
  57.   
  58.     declareWorkbenchImage(ideBundle,  
  59.             IDEInternalWorkbenchImages.IMG_ETOOL_NEXT_NAV, PATH_ETOOL  
  60.                     + "next_nav.gif"false); //$NON-NLS-1$  
  61.   
  62.     declareWorkbenchImage(ideBundle,  
  63.             IDEInternalWorkbenchImages.IMG_ETOOL_PREVIOUS_NAV, PATH_ETOOL  
  64.                     + "prev_nav.gif"false); //$NON-NLS-1$  
  65.   
  66.     declareWorkbenchImage(ideBundle,  
  67.             IDEInternalWorkbenchImages.IMG_WIZBAN_NEWPRJ_WIZ, PATH_WIZBAN  
  68.                     + "newprj_wiz.png"false); //$NON-NLS-1$  
  69.     declareWorkbenchImage(ideBundle,  
  70.             IDEInternalWorkbenchImages.IMG_WIZBAN_NEWFOLDER_WIZ,  
  71.             PATH_WIZBAN + "newfolder_wiz.png"false); //$NON-NLS-1$  
  72.     declareWorkbenchImage(ideBundle,  
  73.             IDEInternalWorkbenchImages.IMG_WIZBAN_NEWFILE_WIZ, PATH_WIZBAN  
  74.                     + "newfile_wiz.png"false); //$NON-NLS-1$  
  75.   
  76.     declareWorkbenchImage(ideBundle,  
  77.             IDEInternalWorkbenchImages.IMG_WIZBAN_IMPORTDIR_WIZ,  
  78.             PATH_WIZBAN + "importdir_wiz.png"false); //$NON-NLS-1$  
  79.     declareWorkbenchImage(ideBundle,  
  80.             IDEInternalWorkbenchImages.IMG_WIZBAN_IMPORTZIP_WIZ,  
  81.             PATH_WIZBAN + "importzip_wiz.png"false); //$NON-NLS-1$  
  82.   
  83.     declareWorkbenchImage(ideBundle,  
  84.             IDEInternalWorkbenchImages.IMG_WIZBAN_EXPORTDIR_WIZ,  
  85.             PATH_WIZBAN + "exportdir_wiz.png"false); //$NON-NLS-1$  
  86.     declareWorkbenchImage(ideBundle,  
  87.             IDEInternalWorkbenchImages.IMG_WIZBAN_EXPORTZIP_WIZ,  
  88.             PATH_WIZBAN + "exportzip_wiz.png"false); //$NON-NLS-1$  
  89.   
  90.     declareWorkbenchImage(ideBundle,  
  91.             IDEInternalWorkbenchImages.IMG_WIZBAN_RESOURCEWORKINGSET_WIZ,  
  92.             PATH_WIZBAN + "workset_wiz.png"false); //$NON-NLS-1$  
  93.   
  94.     declareWorkbenchImage(ideBundle,  
  95.             IDEInternalWorkbenchImages.IMG_DLGBAN_SAVEAS_DLG, PATH_WIZBAN  
  96.                     + "saveas_wiz.png"false); //$NON-NLS-1$  
  97.   
  98.     declareWorkbenchImage(ideBundle,  
  99.             IDEInternalWorkbenchImages.IMG_DLGBAN_QUICKFIX_DLG, PATH_WIZBAN  
  100.                     + "quick_fix.png"false); //$NON-NLS-1$  
  101.   
  102.     declareWorkbenchImage(ideBundle, IDE.SharedImages.IMG_OBJ_PROJECT,  
  103.             PATH_OBJECT + "prj_obj.gif"true); //$NON-NLS-1$  
  104.     declareWorkbenchImage(ideBundle,  
  105.             IDE.SharedImages.IMG_OBJ_PROJECT_CLOSED, PATH_OBJECT  
  106.                     + "cprj_obj.gif"true); //$NON-NLS-1$  
  107.     declareWorkbenchImage(ideBundle, IDE.SharedImages.IMG_OPEN_MARKER,  
  108.             PATH_ELOCALTOOL + "gotoobj_tsk.gif"true); //$NON-NLS-1$  
  109.   
  110.   
  111.     // Quick fix icons  
  112.     declareWorkbenchImage(ideBundle,  
  113.             IDEInternalWorkbenchImages.IMG_ELCL_QUICK_FIX_ENABLED,  
  114.             PATH_ELOCALTOOL + "smartmode_co.gif"true); //$NON-NLS-1$  
  115.   
  116.     declareWorkbenchImage(ideBundle,  
  117.             IDEInternalWorkbenchImages.IMG_DLCL_QUICK_FIX_DISABLED,  
  118.             PATH_DLOCALTOOL + "smartmode_co.gif"true); //$NON-NLS-1$  
  119.   
  120.     declareWorkbenchImage(ideBundle,  
  121.             IDEInternalWorkbenchImages.IMG_OBJS_FIXABLE_WARNING,  
  122.             PATH_OBJECT + "quickfix_warning_obj.gif"true); //$NON-NLS-1$  
  123.     declareWorkbenchImage(ideBundle,  
  124.             IDEInternalWorkbenchImages.IMG_OBJS_FIXABLE_ERROR,  
  125.             PATH_OBJECT + "quickfix_error_obj.gif"true); //$NON-NLS-1$  
  126.   
  127.   
  128.     // task objects  
  129.     // declareRegistryImage(IDEInternalWorkbenchImages.IMG_OBJS_HPRIO_TSK,  
  130.     // PATH_OBJECT+"hprio_tsk.gif");  
  131.     // declareRegistryImage(IDEInternalWorkbenchImages.IMG_OBJS_MPRIO_TSK,  
  132.     // PATH_OBJECT+"mprio_tsk.gif");  
  133.     // declareRegistryImage(IDEInternalWorkbenchImages.IMG_OBJS_LPRIO_TSK,  
  134.     // PATH_OBJECT+"lprio_tsk.gif");  
  135.   
  136.     declareWorkbenchImage(ideBundle, IDE.SharedImages.IMG_OBJS_TASK_TSK,  
  137.             PATH_OBJECT + "taskmrk_tsk.gif"true); //$NON-NLS-1$  
  138.     declareWorkbenchImage(ideBundle, IDE.SharedImages.IMG_OBJS_BKMRK_TSK,  
  139.             PATH_OBJECT + "bkmrk_tsk.gif"true); //$NON-NLS-1$  
  140.   
  141.     declareWorkbenchImage(ideBundle,  
  142.             IDEInternalWorkbenchImages.IMG_OBJS_COMPLETE_TSK, PATH_OBJECT  
  143.                     + "complete_tsk.gif"true); //$NON-NLS-1$  
  144.     declareWorkbenchImage(ideBundle,  
  145.             IDEInternalWorkbenchImages.IMG_OBJS_INCOMPLETE_TSK, PATH_OBJECT  
  146.                     + "incomplete_tsk.gif"true); //$NON-NLS-1$  
  147.     declareWorkbenchImage(ideBundle,  
  148.             IDEInternalWorkbenchImages.IMG_OBJS_WELCOME_ITEM, PATH_OBJECT  
  149.                     + "welcome_item.gif"true); //$NON-NLS-1$  
  150.     declareWorkbenchImage(ideBundle,  
  151.             IDEInternalWorkbenchImages.IMG_OBJS_WELCOME_BANNER, PATH_OBJECT  
  152.                     + "welcome_banner.gif"true); //$NON-NLS-1$  
  153.     declareWorkbenchImage(ideBundle,  
  154.             IDEInternalWorkbenchImages.IMG_OBJS_ERROR_PATH, PATH_OBJECT  
  155.                     + "error_tsk.gif"true); //$NON-NLS-1$  
  156.     declareWorkbenchImage(ideBundle,  
  157.             IDEInternalWorkbenchImages.IMG_OBJS_WARNING_PATH, PATH_OBJECT  
  158.                     + "warn_tsk.gif"true); //$NON-NLS-1$  
  159.     declareWorkbenchImage(ideBundle,  
  160.             IDEInternalWorkbenchImages.IMG_OBJS_INFO_PATH, PATH_OBJECT  
  161.                     + "info_tsk.gif"true); //$NON-NLS-1$  
  162.   
  163.     declareWorkbenchImage(ideBundle,  
  164.             IDEInternalWorkbenchImages.IMG_LCL_FLAT_LAYOUT, PATH_ELOCALTOOL  
  165.                     + "flatLayout.gif"true); //$NON-NLS-1$  
  166.     declareWorkbenchImage(ideBundle,  
  167.             IDEInternalWorkbenchImages.IMG_LCL_HIERARCHICAL_LAYOUT,  
  168.             PATH_ELOCALTOOL + "hierarchicalLayout.gif"true); //$NON-NLS-1$  
  169.     declareWorkbenchImage(ideBundle,  
  170.             IDEInternalWorkbenchImages.IMG_ETOOL_PROBLEM_CATEGORY,  
  171.             PATH_ETOOL + "problem_category.gif"true); //$NON-NLS-1$  
  172.   
  173.     declareWorkbenchImage(ideBundle,  
  174.             IDEInternalWorkbenchImages.IMG_ETOOL_PROBLEMS_VIEW,  
  175.             PATH_EVIEW + "problems_view.gif"true); //$NON-NLS-1$  
  176.     declareWorkbenchImage(ideBundle,  
  177.             IDEInternalWorkbenchImages.IMG_ETOOL_PROBLEMS_VIEW_ERROR,  
  178.             PATH_EVIEW + "problems_view_error.gif"true); //$NON-NLS-1$  
  179.     declareWorkbenchImage(ideBundle,  
  180.             IDEInternalWorkbenchImages.IMG_ETOOL_PROBLEMS_VIEW_WARNING,  
  181.             PATH_EVIEW + "problems_view_warning.gif"true); //$NON-NLS-1$  
  182.   
  183.     // synchronization indicator objects  
  184.     // declareRegistryImage(IDEInternalWorkbenchImages.IMG_OBJS_WBET_STAT,  
  185.     // PATH_OVERLAY+"wbet_stat.gif");  
  186.     // declareRegistryImage(IDEInternalWorkbenchImages.IMG_OBJS_SBET_STAT,  
  187.     // PATH_OVERLAY+"sbet_stat.gif");  
  188.     // declareRegistryImage(IDEInternalWorkbenchImages.IMG_OBJS_CONFLICT_STAT,  
  189.     // PATH_OVERLAY+"conflict_stat.gif");  
  190.   
  191.     // content locality indicator objects  
  192.     // declareRegistryImage(IDEInternalWorkbenchImages.IMG_OBJS_NOTLOCAL_STAT,  
  193.     // PATH_STAT+"notlocal_stat.gif");  
  194.     // declareRegistryImage(IDEInternalWorkbenchImages.IMG_OBJS_LOCAL_STAT,  
  195.     // PATH_STAT+"local_stat.gif");  
  196.     // declareRegistryImage(IDEInternalWorkbenchImages.IMG_OBJS_FILLLOCAL_STAT,  
  197.     // PATH_STAT+"filllocal_stat.gif");  
  198. }  
  199.   
  200. /** 
  201.  * Declares an IDE-specific workbench image. 
  202.  *  
  203.  * @param symbolicName 
  204.  *            the symbolic name of the image 
  205.  * @param path 
  206.  *            the path of the image file; this path is relative to the base 
  207.  *            of the IDE plug-in 
  208.  * @param shared 
  209.  *            <code>true</code> if this is a shared image, and 
  210.  *            <code>false</code> if this is not a shared image 
  211.  * @see IWorkbenchConfigurer#declareImage 
  212.  */  
  213. private void declareWorkbenchImage(Bundle ideBundle, String symbolicName,  
  214.         String path, boolean shared) {  
  215.     URL url = FileLocator.find(ideBundle, new Path(path), null);  
  216.     ImageDescriptor desc = ImageDescriptor.createFromURL(url);  
  217.     getWorkbenchConfigurer().declareImage(symbolicName, desc, shared);  
  218. }  

 

由于jdt是在为ide服务的,所以在重用组件时遇到的问题应该可以在eclipse源码中找到
答案。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值