eclipse rcp 使用监听器在不同的viewer之间传递数据
需求:
我需要在一个view中选中多条记录,然后把选中的记录传输到另一个页面中,另一个页面是通过popup menu点击事件唤醒的。具体效果如下图:
实现办法如下:
1. 先在SQL审核平台的viewer中定义一个内部类,这个内部类实现 org.eclipse.jface.viewers.ISelectionProvider 这个接口,代码如下:
private class SqlHisTableSelector implements ISelectionProvider { private final Map<ISelectionChangedListener, SelectionListener> listeners = new IdentityHashMap<>(); @Override public void addSelectionChangedListener(ISelectionChangedListener listener) { SelectionAdapter selectionAdapter = new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { listener.selectionChanged(new SelectionChangedEvent(SqlHisTableSelector.this, getSelection())); } }; sqlHisTable.addSelectionListener(selectionAdapter); listeners.put(listener, selectionAdapter); } @Override public void removeSelectionChangedListener(ISelectionChangedListener listener) { if(!sqlHisTable.isDisposed()) { sqlHisTable.removeSelectionListener(listeners.remove(listener)); } } @Override public void setSelection(ISelection selection) { // TODO Auto-generated method stub } @Override public ISelection getSelection() { return SqlInspectionView.this.getSelection(); } }
其中 sqlHisTable 这个变量是在SQL审核平台页面定义的一个全局变量,也就是代表图片中的鼠标选中记录所在的table。
SqlInspectionView.this.getSelection(); 代码是获取 sqlHisTable 选中记录的方法:
1 public IStructuredSelection getSelection() { 2 TableItem[] items = sqlHisTable.getSelection(); 3 List<QMMetaEventFileModel> data = new ArrayList<>(); 4 for (int i = 0, itemsLength = items.length; i < itemsLength; i++) { 5 data.add(new QMMetaEventFileModel(items[i].getText(2),items[i].getText(1),Long.parseLong(items[i].getText(6)), items[i].getText(0))); 6 } 7 return new StructuredSelection(data); 8 } 9
这个 ISelectionProvider 定义好后,别忘记在 SqlInspectionView 界面创建过程中,把这个ISelectionProvider 注册到监听服务中
注册好后,那么我们可以在另一个界面,定义一个接受类,这个类必须实现 org.eclipse.ui.ISelectionListener 这个监听接口,那么这里我不是在一个界面中定义的,我是在页面跳转的handler处理类中定义的,如下:
public class NewSqlSendDialogHandler extends AbstractHandler{ private static final Log log = Log.getLog(NewSqlSendDialogHandler.class); public NewSqlSendDialogHandler() { System.out.println(1111); SqlHisTableReceiver r = new SqlHisTableReceiver(); PlatformUI.getWorkbench().getActiveWorkbenchWindow().getSelectionService().addSelectionListener(r); } @Override public Object execute(ExecutionEvent event) throws ExecutionException { // ISelection selection = HandlerUtil.getCurrentSelection(event); IStructuredSelection selection = HandlerUtil.getCurrentStructuredSelection(event); List<QMMetaEventFileModel> list = selection.toList(); IWorkbenchWindow window = HandlerUtil.getActiveWorkbenchWindow(event); // TODO 判断用户是否登录,如果未登录,跳转到登录页,登录成功后弹出对话框;如果登录,直接弹出对话框 NewSqlSendDialog.openNewSqlSendDialog(window, list); return null; } private class SqlHisTableReceiver implements ISelectionListener { @Override public void selectionChanged(IWorkbenchPart part, ISelection selection) { if(selection != null) { if(selection instanceof IStructuredSelection) { IStructuredSelection st = (IStructuredSelection) selection; Object firstElement = st.getFirstElement(); // System.out.println(firstElement); } } } } }
这里的 SqlHisTableReceiver 类就是选择监听的接受类。当然也不要忘记在handler类创建的时候把这个 SqlHisTableReceiver 类也需要初始化,初始化代码就在空参构造中。这样每次在SQL审核界面多选SQL记录,在 SqlHisTableReceiver 类的selectionChanged 方法中就会获取到选中的记录。这个比较适合在另一个页面直接定义 SqlHisTableReceiver。然而,我这边页面的跳转需要调用
NewSqlSendDialog.openNewSqlSendDialog(window, list);
这行代码,因此,我直接使用了
IStructuredSelection selection = HandlerUtil.getCurrentStructuredSelection(event);
这行代码获取选中的记录,然后再把数据传输到另一个页面。
参考: https://stackoverflow.com/questions/11964829/how-to-pass-a-parameterized-command-to-a-commandcontributionitem https://stackoverflow.com/questions/15976567/eclipse-rcphow-to-pass-selection-into-handler http://www.360doc.com/content/12/0510/10/1332348_210021486.shtml https://jingyan.baidu.com/article/fc07f989a679de12ffe519d7.html https://www.eclipse.org/articles/Article-WorkbenchSelections/SelectionProviderIntermediate.java
本文来自博客园,作者:margo,转载请注明原文链接:https://www.cnblogs.com/ZMargo/articles/12972784.html