eclipseRCP深入浅出(学习总结)2015.08.11
2015-08-12 00:00
573 查看
5.5 Adding Images
首先要把图片放到插件工程的icons的根目录下,接下来要通过代码引用到图片而不是直接记住图片在磁盘中的位置。标准的做法就是创建一个接口interface来记录图片的路径,接下来创建IImageKeys接口,其中的每一个静态常量都唯一表示一张图片在icons目录下的路径:
public interface IImageKeys {
public static final String ONLINE = "icons/online.gif";
public static final String OFFLINE = "icons/offline.gif";
public static final String DO_NOT_DISTURB = "icons/dnd.gif";
public static final String GROUP = "icons/groups.gif";
public static final String AWAY = "icons/away.gif";
public static final String ADD_CONTACT = "icons/add_contact.gif";
}
注意到图片的路径是取项目名称后的路径,是相对路径,相对于同一项目的。
在Eclipse中一张图片关联着两个对象:Images和ImageDescriptors。
Images:是能展示的图片对象,它能够提供对底层操作系统资源的操作,是一个重量级对象,所以当这个对象不再使用时需要释放资源。
ImageDescriptors:是图片的轻量级对象,它能够找到真正的物理图片,并创建Images对象,属于延迟创建,不是立即创建。
我们可以使用ImageDescriptors来对图片对象进行一系列操作。ImageDescriptors和图片的关系就像File和FileInputStream的关系:Files是轻量级对象,与系统资源没有直接关联到一起,,但是FileInputStream能够获取对文件的操作,并且触发对文件的访问。
程序-----流(FileInputStream)-------文件(File)
程序------ImageDescriptors-------------图片(Image)
要创建ImageDescriptors,首先通过Bundle.getEntry(String)来获取图片文件的位置,然后调用createFromURL(URL)来创建ImageDescriptors的实例:
public ImageDescriptor createImageDescriptorFor(String id) {
URL url = Platform.getBundle("org.eclipsercp.hyperbola").
getEntry(id);
return ImageDescriptor.createFromURL(url);
}
这是一种大众化的编码模式,AbstractUIPlugin有个静态方法叫做imageDescriptorFromPlugin(String pluginId,String imageFilePath),这个方法会在所有合适的位置搜索被请求的图片并返回ImageDescriptor,这个方法会用Bundle的实例对象来访问插件中的文件,这个方法中的第一个参数就是传插件的ID,这个ID被定义在插件editor的第一个页面(page)中,第二个参数是图片的相对路径:
org.eclipsercp.hyperbola/Application
public static final String PLUGIN_ID = "org.eclipsercp.hyperbola";
注意:由于插件可以存放在任何地方(目录或者JAR中),所以无法直接访问插件中的文件(例如使用IO文件流),但是Eclipse运行时提供了几个方便的方法来访问插件中的文件,例如Bundle.getEntry(path)。
由于图片是系统资源所以需要被管理,通过使用IWorkbench适配器,Workbench可以管理那些已被创建的图片,我们只需要在适配器中重写相应的方法,并返回ImageDescriptor。
联系人实体显示什么图片,依赖于那个用户当前的状态(在线、下线、免打扰等),在HyperbolaAdapterFactory中添加方法presenceToKey(String presense),他会基于不同的参数presense返回不同的图片关键字。
private String presenseToKey(Presence presense){
if(Presence.ONLINE == presense){
return IImageKeys.ONLINE;
}
if(Presence.AWAY == presense){
return IImageKeys.AWAY;
}
if(Presence.DO_NOT_DISTURB == presense){
return IImageKeys.DO_NOT_DISTURB;
}
if(Presence.INVISIBLE == presense){
return IImageKeys.OFFLINE;
}
return IImageKeys.OFFLINE;
}
还要重写联系人实体,和群组实体的适配器中的getImageDescriptor()方法:
public ImageDescriptor getImageDescriptor(Object object) {
return AbstractUIPlugin.imageDescriptorFromPlugin(
Application.PLUGIN_ID, IImageKeys.GROUP);
}
public ImageDescriptor getImageDescriptor(Object object) {
ContactsEntry entry = ((ContactsEntry) object);
String key = presenceToKey(entry.getPresence());
return AbstractUIPlugin.imageDescriptorFromPlugin(
Application.PLUGIN_ID, key);
首先要把图片放到插件工程的icons的根目录下,接下来要通过代码引用到图片而不是直接记住图片在磁盘中的位置。标准的做法就是创建一个接口interface来记录图片的路径,接下来创建IImageKeys接口,其中的每一个静态常量都唯一表示一张图片在icons目录下的路径:
public interface IImageKeys {
public static final String ONLINE = "icons/online.gif";
public static final String OFFLINE = "icons/offline.gif";
public static final String DO_NOT_DISTURB = "icons/dnd.gif";
public static final String GROUP = "icons/groups.gif";
public static final String AWAY = "icons/away.gif";
public static final String ADD_CONTACT = "icons/add_contact.gif";
}
注意到图片的路径是取项目名称后的路径,是相对路径,相对于同一项目的。
在Eclipse中一张图片关联着两个对象:Images和ImageDescriptors。
Images:是能展示的图片对象,它能够提供对底层操作系统资源的操作,是一个重量级对象,所以当这个对象不再使用时需要释放资源。
ImageDescriptors:是图片的轻量级对象,它能够找到真正的物理图片,并创建Images对象,属于延迟创建,不是立即创建。
我们可以使用ImageDescriptors来对图片对象进行一系列操作。ImageDescriptors和图片的关系就像File和FileInputStream的关系:Files是轻量级对象,与系统资源没有直接关联到一起,,但是FileInputStream能够获取对文件的操作,并且触发对文件的访问。
程序-----流(FileInputStream)-------文件(File)
程序------ImageDescriptors-------------图片(Image)
要创建ImageDescriptors,首先通过Bundle.getEntry(String)来获取图片文件的位置,然后调用createFromURL(URL)来创建ImageDescriptors的实例:
public ImageDescriptor createImageDescriptorFor(String id) {
URL url = Platform.getBundle("org.eclipsercp.hyperbola").
getEntry(id);
return ImageDescriptor.createFromURL(url);
}
这是一种大众化的编码模式,AbstractUIPlugin有个静态方法叫做imageDescriptorFromPlugin(String pluginId,String imageFilePath),这个方法会在所有合适的位置搜索被请求的图片并返回ImageDescriptor,这个方法会用Bundle的实例对象来访问插件中的文件,这个方法中的第一个参数就是传插件的ID,这个ID被定义在插件editor的第一个页面(page)中,第二个参数是图片的相对路径:
org.eclipsercp.hyperbola/Application
public static final String PLUGIN_ID = "org.eclipsercp.hyperbola";
注意:由于插件可以存放在任何地方(目录或者JAR中),所以无法直接访问插件中的文件(例如使用IO文件流),但是Eclipse运行时提供了几个方便的方法来访问插件中的文件,例如Bundle.getEntry(path)。
由于图片是系统资源所以需要被管理,通过使用IWorkbench适配器,Workbench可以管理那些已被创建的图片,我们只需要在适配器中重写相应的方法,并返回ImageDescriptor。
联系人实体显示什么图片,依赖于那个用户当前的状态(在线、下线、免打扰等),在HyperbolaAdapterFactory中添加方法presenceToKey(String presense),他会基于不同的参数presense返回不同的图片关键字。
private String presenseToKey(Presence presense){
if(Presence.ONLINE == presense){
return IImageKeys.ONLINE;
}
if(Presence.AWAY == presense){
return IImageKeys.AWAY;
}
if(Presence.DO_NOT_DISTURB == presense){
return IImageKeys.DO_NOT_DISTURB;
}
if(Presence.INVISIBLE == presense){
return IImageKeys.OFFLINE;
}
return IImageKeys.OFFLINE;
}
还要重写联系人实体,和群组实体的适配器中的getImageDescriptor()方法:
public ImageDescriptor getImageDescriptor(Object object) {
return AbstractUIPlugin.imageDescriptorFromPlugin(
Application.PLUGIN_ID, IImageKeys.GROUP);
}
public ImageDescriptor getImageDescriptor(Object object) {
ContactsEntry entry = ((ContactsEntry) object);
String key = presenceToKey(entry.getPresence());
return AbstractUIPlugin.imageDescriptorFromPlugin(
Application.PLUGIN_ID, key);
相关文章推荐
- Java垃圾回收机制 入门
- Java集合框架 入门
- Java异常处理机制
- MyEclipse设置Java代码注释模板
- JAVA 汉字ASCII范围
- springmvc 上传文件 type=file name=imagepath request转换出
- 解决一个少见的错误java.lang.NoClassDefFoundError
- eclipseRCP深入浅出(学习总结)2015.08.08
- 从源码来理解ArrayList和LinkedList区别
- Java并发教程
- java基础--多线程
- spring 之jdbcTemplate使用
- Java synchronized详解
- java一些常见常识
- java 重写的学习
- java 继承的学习(转)
- Java并发编程:volatile关键字解析
- Myeclipse 使用JDBC添加员工信息
- java静态初始化代码块
- keytool 错误 java.io.IOException: incorrect AVA format