RCP 视图间通信:SWT Canvas向JFace ViewPart发送消息
2013-08-02 17:58
113 查看
问题:如何在一个SWT Canvas控件里面发送事件消息给JFace ViewPart 控件。
实现的功能:在Canva内点击鼠标时,能将点击位置发送给ViewPart控件,供其处理后显示。
解决方案:
使用一个ViewPart作为Canvas的父控件,:
然后就可以利用RCP的Selection Provider-Selection Listener机制在ViewPart之间通信了。
Step 1、首先,为CanvasViewPart中实现ISelectionProvider接口:
Step 2、然后为通信目标视图View实现ISelectionListener接口。
代码解析:
事件源Canvas控件的父控件CanvasViewPart实现了事件提供者接口ISelectionProvider,并将自身注册到RCP的事件传递机制中:
RCP的事件传递机制会通过ISelectionProvider接口方法
将所有已注册到RCP事件传递机制的监听者实例通知给CanvasViewPart,这些实例均包含ISelectionChangedListener接口,在需要传递事件给其他监听者时,可以使用其ISelectionChangedListener接口方法selectionChanged(event)。
事件目的地View实现了事件监听者接口ISelectionListener,当事件到达时,其将调用ISelectionListener接口的selectionChanged方法处理。
实现的功能:在Canva内点击鼠标时,能将点击位置发送给ViewPart控件,供其处理后显示。
解决方案:
使用一个ViewPart作为Canvas的父控件,:
public class CanvasViewPart extends ViewPart implements ISelectionProvider { private Canvas canvas; private ListenerList selectionChangeListeners = new ListenerList(); @Override public void createPartControl(Composite parent) { parent.setLayout(new FillLayout(SWT.HORIZONTAL)); canvas = new Canvas(parent, SWT.NONE); canvas.addMouseListener(new MouseListener() { @Override public void mouseUp(MouseEvent e) { } @Override public void mouseDown(MouseEvent e) { } @Override public void mouseDoubleClick(MouseEvent e) { System.out.println("Double click!"); setSelection(new Point2D(e.x, e.y)); } }); // 注册此事件提供者。 this.getSite().setSelectionProvider(this); }
然后就可以利用RCP的Selection Provider-Selection Listener机制在ViewPart之间通信了。
Step 1、首先,为CanvasViewPart中实现ISelectionProvider接口:
@Override public void addSelectionChangedListener(ISelectionChangedListener listener) { selectionChangeListeners.add(listener); } @Override public ISelection getSelection() { // TODO Auto-generated method stub return null; } @Override public void removeSelectionChangedListener( ISelectionChangedListener listener) { selectionChangeListeners.remove(listener); } @Override public void setSelection(ISelection selection) { final SelectionChangedEvent event = new SelectionChangedEvent( CanvasViewPart.this, selection); Object[] listeners = selectionChangeListeners.getListeners(); for (int i = 0; i < listeners.length; ++i) { final ISelectionChangedListener object = (ISelectionChangedListener) listeners[i]; SafeRunnable.run(new SafeRunnable() { public void run() { object.selectionChanged(event); } }); } }
Step 2、然后为通信目标视图View实现ISelectionListener接口。
@Override public void selectionChanged(IWorkbenchPart part, ISelection selection) { System.out.println("In View"); viewer.setInput(new String[] { ((Point2D) selection).toString() }); }
代码解析:
事件源Canvas控件的父控件CanvasViewPart实现了事件提供者接口ISelectionProvider,并将自身注册到RCP的事件传递机制中:
this.getSite().setSelectionProvider(this);
RCP的事件传递机制会通过ISelectionProvider接口方法
addSelectionChangedListener(ISelectionChangedListener listener)
将所有已注册到RCP事件传递机制的监听者实例通知给CanvasViewPart,这些实例均包含ISelectionChangedListener接口,在需要传递事件给其他监听者时,可以使用其ISelectionChangedListener接口方法selectionChanged(event)。
事件目的地View实现了事件监听者接口ISelectionListener,当事件到达时,其将调用ISelectionListener接口的selectionChanged方法处理。
相关文章推荐
- Smack 结合 Openfire服务器,建立IM通信,发送聊天消息
- 在两个不同的程序实例中发送消息,相互通信
- 向OSG视图Viewer发送消息
- Smack 结合 Openfire服务器,建立IM通信,发送聊天消息
- Smack 结合 Openfire服务器,建立IM通信,发送聊天消息
- Smack 结合 Openfire服务器,建立IM通信,发送聊天消息
- VC/MFC 不同进程间的消息通信与数据(字符串)发送
- TCP网络通信实例--消息的发送与接收
- Smack 结合 Openfire服务器,建立IM通信,发送聊天消息
- scala-akka实现简单的分布式RPC通信框架(主从监听,消息发送)
- linux C++ 网络通信 -- Broken pipe,接收端突然断开,发送没收到,仍然发送消息,会导致进程崩溃
- VC/MFC 不同进程间的消息通信与数据(字符串)发送
- Smack 结合 Openfire服务器,建立IM通信,发送聊天消息
- 蓝牙通信第2篇:建立通信和发送文字消息,文件消息
- 发送WM_COPYDATA消息实现进程间的通信
- Java Smack SDK 结合 Openfire服务器,建立IM通信,发送聊天消息
- 详解Fragment跟Activity之间的通信 利用handler fragment和activity双向发送消息
- Smack 结合 Openfire服务器,建立IM通信,发送聊天消息
- Smack 结合 Openfire服务器,建立IM通信,发送聊天消息
- Socket通信简单实现客户端-服务器消息发送