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

RCP开发遇到SWTError: swt no more handles 问题解决

 
阅读更多
应用场景:在打开的编辑器中创建类图,每打开一次都要用到类图、字体、颜色资源。
分析原因:
        1.在eclipse中图片、字体、颜色都属于org.eclipse.swt.graphics.Resource资源。
            public final class Image extends Resource implements Drawable{...}
            public final class Font extends Resource{....}
            public final class Color extends Resource {...}
而该类型明确说明
* Application code must explicitly invoke the <code>Color.dispose()</code>
* method to release the operating system resources managed by each instance
* when those instances are no longer required.
意思就是说当这些资源实例不在使用的时候,必须调用dispose释放掉。即遵循了谁创建谁负责的原则。
Java开发人员在使用SWT/JFACE的时候,并不能借助于Java内置的垃圾回收机制来彻底完成系统资源的清理(Java虚拟机只能帮助我们释放虚拟机内存中的系统资源句柄引用对象)。
所以当我们在程序中大量的创建资源实例,就会引起大量句柄,导致资源句柄不够用,引发no more handles异常。所以不允许每次都new image/create image或其他资源。

解决办法:
JFaceResources是JFace中的资源管理门面类,由它获取我们的图片、字体、颜色并进行缓存,相应的处理方法如下
JFaceResources.getImageRegistry();
JFaceResources.getFontRegistry();
JFaceResources.getColorRegistry();
以上三个方法都使用了map对资源进行了缓存,所以你只需要put一次,在其他地方get就
ok了。
比如:
/*** 懒加载的方式添加Image资源的处理*@param imageFilePath@return*/
public static Image imageFromPlugin(String imageFilePath) {      Image image = JFaceResources.getImageRegistry().get(imageFilePath);      if(image != null) {         return image;      } else {         ImageDescriptor imageDescriptorFromPlugin = imageDescriptorFromPlugin(PLUGIN_ID(本插件的ID), imageFilePath);         image = imageDescriptorFromPlugin.createImage();         JFaceResources.getImageRegistry().put(imageFilePath, image);         return image;      }   }


使用这种方式时,注意一点,Activator中的stop方法手动将资源管理器中的资源释放掉:
public void stop(BundleContext bundleContext) throws Exception {      JFaceResources.getImageRegistry().dispose();      Activator.context = null;      plugin = null;   }


此后在使用图片资源时,都使用了这种方式,通过Activator. imageFromPlugin(imageFilePath)获取Image对象。

当然有些接口中要求返回的是ImageDescriptor,直接调用
ImageDescriptor org.eclipse.ui.plugin.AbstractUIPlugin.imageDescriptorFromPlugin(String pluginId, String imageFilePath)
方法即可,不会造成No more handlers错误。
分享到:
评论

相关推荐

    eclipse插件开发: rcp/swt相关资料

    eclipse插件开发: rcp/swt相关资料 rcp swt 插件开发

    开发项目用SWING与RCP与SWT.JFACE的分析

    开发项目用SWING与RCP与SWT.JFACE的分析 第一个SWT程序 下面让我们开始一个SWT程序。(注意:以下的例子和说明主要针对Windows平台,其它的操作系统应该大同小异)。首先要在Eclipse安装文件中找到SWT包,Eclipse...

    Eclipse RCP开发教程

    Eclipse RCP开发教程,RCP入门教程,教你如何使用SWT Eclipse RCP开发教程,RCP入门教程,教你如何使用SWT Eclipse RCP开发教程,RCP入门教程,教你如何使用SWT Eclipse RCP开发教程,RCP入门教程,教你如何使用SWT

    基于SWt,JFace的Rcp 开发实例

    一个介绍RCp开发的实例项目,包含了SWt,JFace组件 的用法,特别适用于初学者

    通过例子学习EclipseRCP开发

    本文讲述如何利用Eclipse RCP架构来进行应用开发。本文涵盖了创建RCP应用的各个方面:使用命令、视图、编辑器、对话框及创建与部署Eclipse产品。

    RCP,RCP开发

    RCP&OSGI;

    定制 SWT RCP 界面--如何编写一个漂亮的 SWT

    SWT RCP 界面--如何编写一个漂亮的 SWT RCP 界面

    Eclipse RCP 开发资料

    Eclipse RCP 开发资料打包下载 目录如下: RCP程序设计.pdf(推荐) Addison.Wesley.Eclipse.Rich.Client.Platform.Designing.Coding.and.Packaging.Java.Applications.Oct.2005.chm Eclipse+RCP入门.pdf example_...

    Eclipse RCP与Spring OSGi技术详解与最佳实践

    以及Eclipse RCP扩展的使用和扩展点的开发,掌握这些技术知识的读者将能构建一个结构完整的Eclipse RCP软件,并解决软件开发过程中遇到的故障;实战篇(第13-15章)详细讲解了Eclipse RCP与Spring OSGi框架、...

    通过例子学习Eclipse RCP开发

    通过例子学习Eclipse RCP开发 通过例子学习Eclipse RCP开发 swt 插件开发技术文档

    eclipse 3.6 rcp 开发

    Eclipse RCP允许开发者使用eclipse结构风格设计弹性的可扩展的应用程序,可重用Eclipse中已存在的方法和编码模式。俗话说,万事开头难。Eclipse RCP入手可能会比较困难、费时。接下来我们将主要讲述如何让RCP工作. ...

    RCP开发书籍资料简介

    转载的他人的资料 希望对大家有用 RCP开发书籍资料简介 插件开发 - 中国Eclipse社区

    eclipse rcp开发入六教程及培训资料

    网络中最全面最合适学习或开发...包含eclipse rcp开发入门教程; eclipse rcp基础教程;eclipse rcp开发自学教程; eclipse rcp开发培训教程及ppt等相关资料;教程中包含一步步操作实例,包含对开发原理的讲解与说明;

    RCP 开发自学教程

    RCP Plug-in开发自学教程.pdf

    rcp 开发自学教程

    rcp 开发自学教程,eclipse插件开发,是个很不错的入门教程

    SWT RCP JAVA WEB QQ 支持外网通信

    采用RCP开发的java版聊天工具,采用socket技术,支持外网聊天、传文件等功能。在局域网内传输更快。

    eclipse rcp 开发基础教程

    eclipse rcp 开发基础教程 入门级别

    RCP开发入门-PDF.7z

    eclipse RCP 开发很棒的PDF书籍。开源于网络,供大家学习

    RCP 开发实例 源码

    RCP 开发实例,纯界面,没有连接数据库

Global site tag (gtag.js) - Google Analytics