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

          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 閱讀(1982) 評論(1)  編輯  收藏 所屬分類: Eclispe 插件開發

          Feedback

          # re: RCP 中視圖之間的通訊[OSGI-EventAdmin] 2014-06-16 15:31 lww
          自己簡單定義了個rcp,有兩個視圖,但是點擊了按鈕,就出錯,ServiceReference<EventAdmin> ref = ctx.getServiceReference(EventAdmin.class); 這個獲得的值為null,怎么辦?  回復  更多評論
            

          主站蜘蛛池模板: 瑞金市| 瑞安市| 乐昌市| 平邑县| 方城县| 名山县| 蓬莱市| 绿春县| 彭阳县| 松江区| 信丰县| 海阳市| 五莲县| 定远县| 磐安县| 宿松县| 康保县| 林周县| 保康县| 涿州市| 万荣县| 五家渠市| 崇阳县| 阿鲁科尔沁旗| 延庆县| 神农架林区| 德兴市| 塔城市| 阿荣旗| 临武县| 旺苍县| 东乌珠穆沁旗| 资中县| 巨鹿县| 林口县| 荥阳市| 恩施市| 宁陕县| 兴文县| 陆丰市| 蒙山县|