`
AquariusM
  • 浏览: 146755 次
  • 性别: Icon_minigender_1
  • 来自: 南阳
社区版块
存档分类
最新评论

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

阅读更多

这几天因为北京的项目开展,平台加入了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()方法用来解决图标的问题。
实现如下:

 

	/**
	 * Declares all IDE-specific workbench images. This includes both "shared"
	 * images (named in {@link IDE.SharedImages}) and internal images (named in
	 * {@link org.eclipse.ui.internal.ide.IDEInternalWorkbenchImages}).
	 * 
	 * @see IWorkbenchConfigurer#declareImage
	 */
	private void declareWorkbenchImages() {

		final String ICONS_PATH = "$nl$/icons/full/";//$NON-NLS-1$
		final String PATH_ELOCALTOOL = ICONS_PATH + "elcl16/"; // Enabled //$NON-NLS-1$

		// toolbar
		// icons.
		final String PATH_DLOCALTOOL = ICONS_PATH + "dlcl16/"; // Disabled //$NON-NLS-1$
		// //$NON-NLS-1$
		// toolbar
		// icons.
		final String PATH_ETOOL = ICONS_PATH + "etool16/"; // Enabled toolbar //$NON-NLS-1$
		// //$NON-NLS-1$
		// icons.
		final String PATH_DTOOL = ICONS_PATH + "dtool16/"; // Disabled toolbar //$NON-NLS-1$
		// //$NON-NLS-1$
		// icons.
		final String PATH_OBJECT = ICONS_PATH + "obj16/"; // Model object //$NON-NLS-1$
		// //$NON-NLS-1$
		// icons
		final String PATH_WIZBAN = ICONS_PATH + "wizban/"; // Wizard //$NON-NLS-1$
		// //$NON-NLS-1$
		// icons

		// View icons
		final String PATH_EVIEW= ICONS_PATH + "eview16/"; //$NON-NLS-1$


		Bundle ideBundle = Platform.getBundle(IDEWorkbenchPlugin.IDE_WORKBENCH);

		declareWorkbenchImage(ideBundle,
				IDEInternalWorkbenchImages.IMG_ETOOL_BUILD_EXEC, PATH_ETOOL
						+ "build_exec.gif", false); //$NON-NLS-1$
		declareWorkbenchImage(ideBundle,
				IDEInternalWorkbenchImages.IMG_ETOOL_BUILD_EXEC_HOVER,
				PATH_ETOOL + "build_exec.gif", false); //$NON-NLS-1$
		declareWorkbenchImage(ideBundle,
				IDEInternalWorkbenchImages.IMG_ETOOL_BUILD_EXEC_DISABLED,
				PATH_DTOOL + "build_exec.gif", false); //$NON-NLS-1$

		declareWorkbenchImage(ideBundle,
				IDEInternalWorkbenchImages.IMG_ETOOL_SEARCH_SRC, PATH_ETOOL
						+ "search_src.gif", false); //$NON-NLS-1$
		declareWorkbenchImage(ideBundle,
				IDEInternalWorkbenchImages.IMG_ETOOL_SEARCH_SRC_HOVER,
				PATH_ETOOL + "search_src.gif", false); //$NON-NLS-1$
		declareWorkbenchImage(ideBundle,
				IDEInternalWorkbenchImages.IMG_ETOOL_SEARCH_SRC_DISABLED,
				PATH_DTOOL + "search_src.gif", false); //$NON-NLS-1$

		declareWorkbenchImage(ideBundle,
				IDEInternalWorkbenchImages.IMG_ETOOL_NEXT_NAV, PATH_ETOOL
						+ "next_nav.gif", false); //$NON-NLS-1$

		declareWorkbenchImage(ideBundle,
				IDEInternalWorkbenchImages.IMG_ETOOL_PREVIOUS_NAV, PATH_ETOOL
						+ "prev_nav.gif", false); //$NON-NLS-1$

		declareWorkbenchImage(ideBundle,
				IDEInternalWorkbenchImages.IMG_WIZBAN_NEWPRJ_WIZ, PATH_WIZBAN
						+ "newprj_wiz.png", false); //$NON-NLS-1$
		declareWorkbenchImage(ideBundle,
				IDEInternalWorkbenchImages.IMG_WIZBAN_NEWFOLDER_WIZ,
				PATH_WIZBAN + "newfolder_wiz.png", false); //$NON-NLS-1$
		declareWorkbenchImage(ideBundle,
				IDEInternalWorkbenchImages.IMG_WIZBAN_NEWFILE_WIZ, PATH_WIZBAN
						+ "newfile_wiz.png", false); //$NON-NLS-1$

		declareWorkbenchImage(ideBundle,
				IDEInternalWorkbenchImages.IMG_WIZBAN_IMPORTDIR_WIZ,
				PATH_WIZBAN + "importdir_wiz.png", false); //$NON-NLS-1$
		declareWorkbenchImage(ideBundle,
				IDEInternalWorkbenchImages.IMG_WIZBAN_IMPORTZIP_WIZ,
				PATH_WIZBAN + "importzip_wiz.png", false); //$NON-NLS-1$

		declareWorkbenchImage(ideBundle,
				IDEInternalWorkbenchImages.IMG_WIZBAN_EXPORTDIR_WIZ,
				PATH_WIZBAN + "exportdir_wiz.png", false); //$NON-NLS-1$
		declareWorkbenchImage(ideBundle,
				IDEInternalWorkbenchImages.IMG_WIZBAN_EXPORTZIP_WIZ,
				PATH_WIZBAN + "exportzip_wiz.png", false); //$NON-NLS-1$

		declareWorkbenchImage(ideBundle,
				IDEInternalWorkbenchImages.IMG_WIZBAN_RESOURCEWORKINGSET_WIZ,
				PATH_WIZBAN + "workset_wiz.png", false); //$NON-NLS-1$

		declareWorkbenchImage(ideBundle,
				IDEInternalWorkbenchImages.IMG_DLGBAN_SAVEAS_DLG, PATH_WIZBAN
						+ "saveas_wiz.png", false); //$NON-NLS-1$

		declareWorkbenchImage(ideBundle,
				IDEInternalWorkbenchImages.IMG_DLGBAN_QUICKFIX_DLG, PATH_WIZBAN
						+ "quick_fix.png", false); //$NON-NLS-1$

		declareWorkbenchImage(ideBundle, IDE.SharedImages.IMG_OBJ_PROJECT,
				PATH_OBJECT + "prj_obj.gif", true); //$NON-NLS-1$
		declareWorkbenchImage(ideBundle,
				IDE.SharedImages.IMG_OBJ_PROJECT_CLOSED, PATH_OBJECT
						+ "cprj_obj.gif", true); //$NON-NLS-1$
		declareWorkbenchImage(ideBundle, IDE.SharedImages.IMG_OPEN_MARKER,
				PATH_ELOCALTOOL + "gotoobj_tsk.gif", true); //$NON-NLS-1$


		// Quick fix icons
		declareWorkbenchImage(ideBundle,
				IDEInternalWorkbenchImages.IMG_ELCL_QUICK_FIX_ENABLED,
				PATH_ELOCALTOOL + "smartmode_co.gif", true); //$NON-NLS-1$

		declareWorkbenchImage(ideBundle,
				IDEInternalWorkbenchImages.IMG_DLCL_QUICK_FIX_DISABLED,
				PATH_DLOCALTOOL + "smartmode_co.gif", true); //$NON-NLS-1$

		declareWorkbenchImage(ideBundle,
				IDEInternalWorkbenchImages.IMG_OBJS_FIXABLE_WARNING,
				PATH_OBJECT + "quickfix_warning_obj.gif", true); //$NON-NLS-1$
		declareWorkbenchImage(ideBundle,
				IDEInternalWorkbenchImages.IMG_OBJS_FIXABLE_ERROR,
				PATH_OBJECT + "quickfix_error_obj.gif", true); //$NON-NLS-1$


		// task objects
		// declareRegistryImage(IDEInternalWorkbenchImages.IMG_OBJS_HPRIO_TSK,
		// PATH_OBJECT+"hprio_tsk.gif");
		// declareRegistryImage(IDEInternalWorkbenchImages.IMG_OBJS_MPRIO_TSK,
		// PATH_OBJECT+"mprio_tsk.gif");
		// declareRegistryImage(IDEInternalWorkbenchImages.IMG_OBJS_LPRIO_TSK,
		// PATH_OBJECT+"lprio_tsk.gif");

		declareWorkbenchImage(ideBundle, IDE.SharedImages.IMG_OBJS_TASK_TSK,
				PATH_OBJECT + "taskmrk_tsk.gif", true); //$NON-NLS-1$
		declareWorkbenchImage(ideBundle, IDE.SharedImages.IMG_OBJS_BKMRK_TSK,
				PATH_OBJECT + "bkmrk_tsk.gif", true); //$NON-NLS-1$

		declareWorkbenchImage(ideBundle,
				IDEInternalWorkbenchImages.IMG_OBJS_COMPLETE_TSK, PATH_OBJECT
						+ "complete_tsk.gif", true); //$NON-NLS-1$
		declareWorkbenchImage(ideBundle,
				IDEInternalWorkbenchImages.IMG_OBJS_INCOMPLETE_TSK, PATH_OBJECT
						+ "incomplete_tsk.gif", true); //$NON-NLS-1$
		declareWorkbenchImage(ideBundle,
				IDEInternalWorkbenchImages.IMG_OBJS_WELCOME_ITEM, PATH_OBJECT
						+ "welcome_item.gif", true); //$NON-NLS-1$
		declareWorkbenchImage(ideBundle,
				IDEInternalWorkbenchImages.IMG_OBJS_WELCOME_BANNER, PATH_OBJECT
						+ "welcome_banner.gif", true); //$NON-NLS-1$
		declareWorkbenchImage(ideBundle,
				IDEInternalWorkbenchImages.IMG_OBJS_ERROR_PATH, PATH_OBJECT
						+ "error_tsk.gif", true); //$NON-NLS-1$
		declareWorkbenchImage(ideBundle,
				IDEInternalWorkbenchImages.IMG_OBJS_WARNING_PATH, PATH_OBJECT
						+ "warn_tsk.gif", true); //$NON-NLS-1$
		declareWorkbenchImage(ideBundle,
				IDEInternalWorkbenchImages.IMG_OBJS_INFO_PATH, PATH_OBJECT
						+ "info_tsk.gif", true); //$NON-NLS-1$

		declareWorkbenchImage(ideBundle,
				IDEInternalWorkbenchImages.IMG_LCL_FLAT_LAYOUT, PATH_ELOCALTOOL
						+ "flatLayout.gif", true); //$NON-NLS-1$
		declareWorkbenchImage(ideBundle,
				IDEInternalWorkbenchImages.IMG_LCL_HIERARCHICAL_LAYOUT,
				PATH_ELOCALTOOL + "hierarchicalLayout.gif", true); //$NON-NLS-1$
		declareWorkbenchImage(ideBundle,
				IDEInternalWorkbenchImages.IMG_ETOOL_PROBLEM_CATEGORY,
				PATH_ETOOL + "problem_category.gif", true); //$NON-NLS-1$

		declareWorkbenchImage(ideBundle,
				IDEInternalWorkbenchImages.IMG_ETOOL_PROBLEMS_VIEW,
				PATH_EVIEW + "problems_view.gif", true); //$NON-NLS-1$
		declareWorkbenchImage(ideBundle,
				IDEInternalWorkbenchImages.IMG_ETOOL_PROBLEMS_VIEW_ERROR,
				PATH_EVIEW + "problems_view_error.gif", true); //$NON-NLS-1$
		declareWorkbenchImage(ideBundle,
				IDEInternalWorkbenchImages.IMG_ETOOL_PROBLEMS_VIEW_WARNING,
				PATH_EVIEW + "problems_view_warning.gif", true); //$NON-NLS-1$

		// synchronization indicator objects
		// declareRegistryImage(IDEInternalWorkbenchImages.IMG_OBJS_WBET_STAT,
		// PATH_OVERLAY+"wbet_stat.gif");
		// declareRegistryImage(IDEInternalWorkbenchImages.IMG_OBJS_SBET_STAT,
		// PATH_OVERLAY+"sbet_stat.gif");
		// declareRegistryImage(IDEInternalWorkbenchImages.IMG_OBJS_CONFLICT_STAT,
		// PATH_OVERLAY+"conflict_stat.gif");

		// content locality indicator objects
		// declareRegistryImage(IDEInternalWorkbenchImages.IMG_OBJS_NOTLOCAL_STAT,
		// PATH_STAT+"notlocal_stat.gif");
		// declareRegistryImage(IDEInternalWorkbenchImages.IMG_OBJS_LOCAL_STAT,
		// PATH_STAT+"local_stat.gif");
		// declareRegistryImage(IDEInternalWorkbenchImages.IMG_OBJS_FILLLOCAL_STAT,
		// PATH_STAT+"filllocal_stat.gif");
	}
	
	/**
	 * Declares an IDE-specific workbench image.
	 * 
	 * @param symbolicName
	 *            the symbolic name of the image
	 * @param path
	 *            the path of the image file; this path is relative to the base
	 *            of the IDE plug-in
	 * @param shared
	 *            <code>true</code> if this is a shared image, and
	 *            <code>false</code> if this is not a shared image
	 * @see IWorkbenchConfigurer#declareImage
	 */
	private void declareWorkbenchImage(Bundle ideBundle, String symbolicName,
			String path, boolean shared) {
		URL url = FileLocator.find(ideBundle, new Path(path), null);
		ImageDescriptor desc = ImageDescriptor.createFromURL(url);
		getWorkbenchConfigurer().declareImage(symbolicName, desc, shared);
	}
 

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

分享到:
评论

相关推荐

    导入RCP工程SuperCRM遇到的bug问题解决方案

    ECLIPSE+SWTJFACE核心应用 附有案例的源代码光盘Eclipse+SWT+JFace核心应用光盘,其中工程SuperCRM是一个比较完整的介绍RCP应用的项目,但是在真正运行该工程时,却存在许多bug问题,本人通过调试解决了上述问题,...

    eclipse RCP mp3工程

    【标题】"eclipse RCP mp3工程"指的是一个基于Eclipse Rich Client Platform(RCP)构建的专门处理MP3音频文件的应用程序。Eclipse RCP是一个强大的开发框架,允许开发者创建桌面应用,它提供了丰富的用户界面组件和...

    rcp工程的描述

    **RCP工程详解** RCP(Rich Client Platform)是Eclipse框架提供的一种应用程序开发平台,全称为富客户端平台。它允许开发者构建功能丰富的桌面应用程序,同时利用了Java的跨平台特性,使得应用可以在多种操作系统...

    eclipse RCP 数独工程

    例如,数独游戏的解决方案或用户输入可能会被序列化为XML格式,便于存储和传输。 综合以上信息,我们可以推测这个“eclipse RCP 数独工程”是一个利用Eclipse RCP开发的,包含数独游戏功能的桌面应用。项目可能展示...

    eclipse icons,用来开发rcp桌面应用程序

    Eclipse Icons是Eclipse RCP(Rich Client Platform)开发中常用的一套图形用户界面资源,它们为Eclipse RCP应用程序提供了丰富的图标集,用于构建视觉上吸引人的且易于理解的用户界面。Eclipse RCP是一种基于Java的...

    RCP 嵌入Google map(rcp执行JavaScrit方法,解决打包后路径问题)

    为了解决这个问题,有以下几种解决方案: 1. **相对路径**:使用相对路径而不是绝对路径来引用HTML文件。这需要确保HTML文件与RCP应用的主入口点在同一目录下。 2. **资源加载器**:通过Eclipse的`Platform....

    RCP,RCP开发

    它的主要目标是解决Java应用程序的模块化问题,使得模块间的依赖关系可以动态管理,从而实现模块的热更新、热部署和隔离性。 **OSGI核心特性** 1. **模块化**:OSGI将Java应用划分为可独立加载和卸载的模块(称为...

    rcp自己通过扩展点新建java项目

    在Eclipse RCP(Rich Client Platform)开发中,创建自定义的新建项目向导是提升用户体验和增强应用程序功能的重要步骤。`rcp自己通过扩展点新建java项目`这个主题涉及了如何利用Eclipse的插件体系和扩展点机制来...

    Eclipse RCP 软件打包发布方法

    在实际操作中,可能会遇到一些特定问题,如依赖冲突、资源优化等,这需要根据实际情况进行调整和解决。同时,持续关注Eclipse RCP的更新和社区支持,可以帮助你更好地利用这个平台的优势,提升开发效率和用户体验。

    Eclipse RCP工程包(内附抽取的场景重现)

    这个工程包“Eclipse RCP工程包(内附抽取的场景重现)”显然包含了用于演示或重现特定问题的示例代码,可能是针对Eclipse RCP开发者在开发过程中遇到的问题。虽然具体的描述链接已经失效,但我们可以根据Eclipse ...

    RCP项目导出exe 步骤

    RCP导出EXE 老大难问题。 RCp 程序导出步骤,保证能够导出~

    RCP相关问题汇总

    解决方法包括: - 使用 PDE(Plug-in Development Environment)工具生成 Ant 构建文件,然后编辑 `build.xml`,在 `javac` 标签中添加 `encoding="UTF-8"` 属性,确保编译时使用 UTF-8 编码。 - 修改源代码文件的...

    Eclipse RCP

    Eclipse RCP,全称Eclipse Rich Client Platform,是基于Java平台的一种强大的应用程序框架,用于构建桌面应用程序。它源于Eclipse IDE,但其用途远远超出了集成开发环境(IDE)的范畴,允许开发者构建功能丰富的、...

    RCP在线升级,RCP在线升级

    为了提高用户体验,开发者应该确保有清晰的错误消息和指导,以帮助用户解决问题。 7. **安全性考虑**:在线升级涉及到网络通信,因此必须确保更新过程的安全性。开发者应使用HTTPS来加密传输,防止数据被窃取或篡改...

    RCP常用方法,RCP常用方法

    在应用程序启动时,通常需要一段时间来进行初始化处理,为了提升用户体验并避免用户在等待过程中感到困惑,可以通过设置一个闪屏画面(splash screen)来解决这个问题。在RCP应用中,闪屏画面通常是一张静态的图片。...

    RCP工程转成RAP,并在浏览器中运行

    本文主要介绍如何将一个基于Eclipse RCP(Rich Client Platform)的工程转换为可以在浏览器中运行的RAP(Rapid Application Platform)工程。RCP和RAP都是Eclipse基金会开发的框架,前者用于构建桌面应用程序,后者...

    eclipse rcp 自学教程

    Eclipse RCP(Rich Client Platform)是Eclipse组织提供的一种强大的桌面应用程序开发框架,自Eclipse 3.0版本开始引入。它允许开发者利用Eclipse的底层架构和已有的组件来构建可扩展、功能丰富的应用。RCP的核心...

    Eclipse RCP开发教程

    Eclipse RCP 提供了一种构建用户界面的方法,它基于 Java 技术,支持图形化界面和强大的事件处理机制。RCP 应用程序通常由多个插件组成,每个插件代表应用程序的一个特定功能或组件。这些插件可以互相通信,通过扩展...

Global site tag (gtag.js) - Google Analytics