好好生活,努力工作,天天向上!

BlogJava 首页 新随笔 联系 聚合 管理
  46 Posts :: 1 Stories :: 178 Comments :: 0 Trackbacks
   我在Eclipse新闻组中经常看到讨论视图之间通信的问题,他们经常要面对状态改变之后的同步问题(通常的做法是使用ISelectionService),看来大家对OSGI EventAdmin服务不是很了解,这是一个采用发布订阅模式的事件系统,可以很轻松的应用到您的RCP程序中。

   1、安装
    首先将org.eclipse.osgi.services和org.eclipse.equinox.event添加到工程的依赖项中。
   
   2、发布事件
   public class SenderView extends ViewPart {
  public static final String ID = "viewcommunication.views.SenderView";
  
private Button b;

  
public void createPartControl(Composite parent) {
    parent.setLayout(
new GridLayout());
    b 
= new Button(parent, SWT.PUSH);
    b.setText(
"Send Event");
    b.addSelectionListener(
new SelectionAdapter() {
      @Override
      
public void widgetSelected(SelectionEvent e) {
        BundleContext ctx 
= FrameworkUtil.getBundle(SenderView.class).getBundleContext();
        ServiceReference
<EventAdmin> ref = ctx.getServiceReference(EventAdmin.class);
        EventAdmin eventAdmin 
= ctx.getService(ref);
        Map
<String,Object> properties = new HashMap<String, Object>();
        properties.put(
"DATA"new Date());

        Event event 
= new Event("viewcommunication/syncEvent", properties);
        eventAdmin.sendEvent(event);

        event 
= new Event("viewcommunication/asyncEvent", properties);
        eventAdmin.postEvent(event);
      }
    });
  }

  
public void setFocus() {
    b.setFocus();
  }
}

      3、订阅事件
 1 public class ReceiverView extends ViewPart {
 2   private TableViewer viewer;
 3 
 4   @Override
 5   public void createPartControl(final Composite parent) {
 6     parent.setLayout(new FillLayout());
 7     viewer = new TableViewer(parent);
 8     viewer.getTable().setHeaderVisible(true);
 9     viewer.getTable().setLinesVisible(true);
10     viewer.setLabelProvider(new ColumnLabelProvider() {
11       @Override
12       public String getText(Object element) {
13         return DateFormat.getDateTimeInstance().format(element);
14       }
15     });
16 
17     BundleContext ctx = FrameworkUtil.getBundle(ReceiverView.class).getBundleContext();
18     EventHandler handler = new EventHandler() {
19       public void handleEvent(final Event event) {
20         if( parent.getDisplay().getThread() == Thread.currentThread() ) {
21           viewer.add(event.getProperty("DATA"));
22         } else {
23           parent.getDisplay().syncExec(new Runnable() {
24             public void run() {
25               viewer.add(event.getProperty("DATA"));
26             }
27           });
28         }
29       }
30     };
31 
32     Dictionary<String,String> properties = new Hashtable<String, String>();
33     properties.put(EventConstants.EVENT_TOPIC, "viewcommunication/*");
34     ctx.registerService(EventHandler.class, handler, properties);
35   }
36 
37   @Override
38   public void setFocus() {
39     viewer.getTable().setFocus();
40   }
41 }
42 




不是很复杂,对吧,起码降低了耦合度。
posted on 2011-07-12 15:04 VWPOLO 阅读(1946) 评论(1)  编辑  收藏 所属分类: Eclispe 插件开发

Feedback

# re: RCP 中视图之间的通讯[OSGI-EventAdmin] 2014-06-16 15:31 lww
自己简单定义了个rcp,有两个视图,但是点击了按钮,就出错,ServiceReference<EventAdmin> ref = ctx.getServiceReference(EventAdmin.class); 这个获得的值为null,怎么办?  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航: