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

          BlogJava 首頁 新隨筆 聯(lián)系 聚合 管理
            46 Posts :: 1 Stories :: 178 Comments :: 0 Trackbacks
             我在Eclipse新聞組中經(jīng)常看到討論視圖之間通信的問題,他們經(jīng)常要面對狀態(tài)改變之后的同步問題(通常的做法是使用ISelectionService),看來大家對OSGI EventAdmin服務(wù)不是很了解,這是一個采用發(fā)布訂閱模式的事件系統(tǒng),可以很輕松的應(yīng)用到您的RCP程序中。

             1、安裝
              首先將org.eclipse.osgi.services和org.eclipse.equinox.event添加到工程的依賴項(xiàng)中。
             
             2、發(fā)布事件
             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 




          不是很復(fù)雜,對吧,起碼降低了耦合度。
          posted on 2011-07-12 15:04 VWPOLO 閱讀(1981) 評論(1)  編輯  收藏 所屬分類: Eclispe 插件開發(fā)

          Feedback

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

          主站蜘蛛池模板: 洪江市| 宜春市| 井陉县| 疏勒县| 尚义县| 屯门区| 邵阳县| 宝兴县| 偏关县| 雷山县| 白水县| 中卫市| 额敏县| 措美县| 钟祥市| 社旗县| 阳新县| 西乌珠穆沁旗| 宜宾县| 宝应县| 富平县| 丽水市| 施甸县| 兴城市| 湖口县| 固原市| 二连浩特市| 永寿县| 时尚| 龙口市| 湖北省| 永顺县| 平塘县| 三穗县| 松潘县| 惠水县| 西平县| 嵊泗县| 临漳县| 阿鲁科尔沁旗| 贺兰县|