您的位置:首页 > 编程语言 > Java开发

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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: