`
wangchuanyin
  • 浏览: 32756 次
  • 性别: 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相关资料

    RCP(Rich Client Platform)和SWT(Standard Widget Toolkit)是Eclipse插件开发中的核心概念。 RCP是Eclipse提供的一种用于构建复杂桌面应用程序的框架。它基于OOP(面向对象编程)原则,提供了可扩展性、模块化...

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

    ### 开发项目用SWING与RCP与SWT.JFACE的分析 #### 一、SWT简介 SWT(Standard Widget Toolkit)作为一种图形用户界面工具包,为Java开发者提供了创建高性能且外观统一的桌面应用程序的能力。相较于传统的AWT和...

    RCP,RCP开发

    通过RCP,开发者可以专注于业务逻辑,而UI组件和框架已经由RCP提供,大大提高了开发效率。 **RCP核心特性** 1. **插件化架构**:RCP的核心是插件(Plugin)系统,每个功能模块都可以作为一个独立的插件存在,便于...

    基于SWt,JFace的Rcp 开发实例

    本实例项目"基于SWT、JFace的Rcp开发实例"旨在帮助初学者理解如何利用SWT和JFace这两个关键组件来构建RCP应用程序。 SWT(Standard Widget Toolkit)是Java中的一个GUI库,它提供了一套与操作系统紧密集成的控件,...

    EclipseSWT_JFace_RCP插件开发

    5. **源代码分析**:在"**EclipseSWT_JFace_RCP插件开发**"的源代码中,我们可以期待找到如何使用SWT和JFace创建用户界面,以及如何利用RCP框架构建可扩展应用的示例。开发者可能通过这些代码学习到如何组织插件结构...

    Eclipse的RCP开发的入门教程

    "使用Eclipse RCP进行桌面程序开发(五):2D绘图.doc"涵盖了在RCP应用中进行2D图形绘制的技术,这可能涉及到使用SWT(Standard Widget Toolkit)和JFace库提供的绘图API,创建自定义的图表或者可视化效果。...

    eclipse rcp 开发基础教程

    Eclipse RCP(Rich Client Platform)是基于Java的开发框架,用于构建桌面应用程序。它提供了构建用户界面所需的各种组件和工具,允许开发者创建功能丰富的、交互式的应用程序。Eclipse RCP利用Eclipse IDE的强大...

    rcp 开发自学教程

    **正文** 在IT行业中,RCP(Rich Client Platform)是一种基于Java的开发框架,由Eclipse项目提供...记得实践是检验真理的唯一标准,多动手实践,遇到问题时查阅文档和社区资源,相信你会在RCP开发的道路上越走越远。

    RCP开发指南

    【RCP开发指南】 RCP,全称Rich Client Platform,是一种基于Eclipse框架的桌面应用程序开发平台。它允许开发者创建出具有丰富用户界面和高度可扩展性的独立应用程序。RCP平台是Eclipse从3.0版本开始引入的概念,...

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

    ### 定制SWT RCP界面—如何编写一个漂亮的SWT RCP界面 #### 引言 在现代软件开发中,用户界面(UI)的设计至关重要。一个美观且易用的界面不仅能提升用户体验,还能增强软件的整体竞争力。SWT (Standard Widget ...

    eclipse插件及RCP开发资料.rar

    Eclipse是一款广泛使用的开源集成开发环境(IDE),它以其强大的可...通过学习和实践Eclipse插件及RCP开发,开发者不仅可以提升自己的技能,还能创建出功能丰富、高度定制化的开发环境或桌面应用,服务于各种业务需求。

    RCP 开发实例 源码

    **RCP(Rich Client Platform)开发实例源码详解** RCP,全称为Rich Client Platform,是Eclipse基金会推出的一种客户端应用程序开发框架。它为开发者提供了一个可扩展的平台,用于构建功能丰富的桌面应用,具有...

    Eclipse RCP开发教程

    **Eclipse RCP 开发教程** Eclipse Rich Client Platform (RCP) 是一个用于构建桌面应用程序的框架,它基于 Eclipse IDE 平台,允许开发者利用 Eclipse 的强大功能和丰富的插件系统来创建自定义的、可扩展的应用...

    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_...

    RCP开发入门-PDF.7z

    《RCP开发入门》这本书籍正是针对这一主题,帮助初学者掌握Eclipse RCP的开发技术。 首先,我们要了解RCP的基础概念。Eclipse RCP的核心在于插件(Plugin)系统,每个插件都是一个独立的功能模块,它们通过接口互相...

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

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

    eclipse RCP开发一个简单的MYSQL客户端工具介绍

    本篇文章将详细介绍如何利用Eclipse RCP开发一个简单的MySQL客户端工具,这对于想要深入理解Eclipse RCP框架以及插件开发的开发者来说是非常有帮助的。 首先,我们需要了解Eclipse RCP的基础。Eclipse RCP的核心...

    eclipse 3.6 rcp 开发

    ### Eclipse 3.6 RCP 开发知识点概览 #### 1. 富客户端平台 (RCP) 概述 **1.1 概述** - **定义**: Eclipse Rich Client Platform (RCP) 是一种基于Java的技术框架,用于构建可扩展的桌面应用程序。 - **特点**: ...

    通过例子学习EclipseRCP开发

    本教程将通过实例引导你深入理解Eclipse RCP的开发过程,帮助你掌握如何利用Eclipse的强大功能来创建自定义的、功能丰富的桌面应用。 一、Eclipse RCP基础 Eclipse RCP的核心概念包括部件(Parts)、视图(Views)...

    RCP 开发自学教程

    ### RCP 开发自学教程知识点总结 #### 一、富客户端平台(RCP) **1.1 概述** - **Eclipse RCP (Rich Client Platform)**: 是一款强大的开源框架,用于开发桌面应用,它提供了丰富的组件和工具,使得开发者能够轻松...

Global site tag (gtag.js) - Google Analytics