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

posted @ 2020-05-27 14:42  margo  阅读(313)  评论(0编辑  收藏  举报