我们可以在插件中向 GUI 提供各种视图。但是,UI 视图不能是孤立的。它们需要根据其他视图的状态进行交互和对本身进行更新。所以在这里介绍以下链接视图的方法
我们可以通过下面这几种方法 对视图进行链接:
1、选择提供器 - 选择监听器(selection provider-selection listener)模式,从而让视图对其他视图中的选择做出反应
2、IAdaptable 接口,与某些事件结合使用
3、属性改变监听器,它允许视图将属性改变事件告之已注册的监听器
先来介绍第一种:
一、选择服务器
选择提供器的使用方法很简单,我们只需要让视图实现 ISelectionListener 接口,实现接口中的selectionChanged方法就行了,下面是我的例子
StudentView .java
public class StudentView extends ViewPart implements ISelectionListener {
private Table table;
private TableViewer tableViewer;
private Student student;
public static final String ID = StudentView.class.getName(); //$NON-NLS-1$
* Create contents of the view part
* @param parent
*/
@Override
public void createPartControl(Composite parent) {
Composite container = new Composite(parent, SWT.NONE);
container.setLayout(new FillLayout());
tableViewer = new TableViewer(container, SWT.FULL_SELECTION | SWT.BORDER);
tableViewer.setContentProvider(new ContentProvider());
tableViewer.setLabelProvider(new TableLabelProvider());
tableViewer.setInput(DataProvider.getStudents());
table = tableViewer.getTable();
table.setLinesVisible(true );
table.setHeaderVisible(true );
final TableColumn nameCol = new TableColumn(table, SWT.NONE);
nameCol.setWidth(100 );
nameCol.setText("姓 名" );
//
getSite().getWorkbenchWindow().getSelectionService().addSelectionListener(this );
getViewSite().setSelectionProvider(tableViewer);
}
@Override
public void selectionChanged(IWorkbenchPart part, ISelection selection) {
}
我们通过下面两行代码向工作窗口注册了侦听选择的服务和将tableViewer发布成选择事件源,也就是将 tableViewer 的选择事件向工作窗口注册了,只要实现了 ISelectionListener 并且侦听工作窗口的选择事件的话就可以响应 tableViewer 的事件了。
getViewSite().setSelectionProvider(tableViewer);
StudentView.java这个类的作用主要是发布选择的事件,那么我们现在来看下处理选择事件的类
OtherStudentView .java
public class OtherStudentView extends ViewPart implements ISelectionListener {
private Table table;
private Student student;
private TableViewer tableViewer;
public static final String ID = OtherStudentView.class .getName();
/**
* it.
public void createPartControl(Composite parent) {
tableViewer = new TableViewer(parent, SWT.FULL_SELECTION | SWT.BORDER);
tableViewer.setLabelProvider(new TableLabelProvider());
tableViewer.setContentProvider(new ContentProvider());
table = tableViewer.getTable();
table.setLinesVisible(true );
table.setHeaderVisible(true );
final TableColumn nameCol = new TableColumn(table, SWT.NONE);
nameCol.setWidth(100 );
nameCol.setText("姓 名" );
getSite().getWorkbenchWindow().getSelectionService().addSelectionListener(this );
getViewSite().setSelectionProvider(tableViewer);
}
@Override
public void selectionChanged(IWorkbenchPart part, ISelection selection) {
If(part.getSite().getId().equals(StudentView.ID) {
IStructuredSelection structuredSelection = (IStructuredSelection) selection;
Object object = structuredSelection.getFirstElement();
if (object != null && object instanceof Student) {
student = (Student) object;
updateStudentView(student);
}
}
}
private void updateStudentView(Student student) {
if (student == null ) {
tableViewer.setInput(new Object());
} else {
tableViewer.setInput(student);
}
}
}
我们在 selectionChanged方法中实现自己的功能
IStructuredSelection structuredSelection = (IStructuredSelection) selection;
Object object = structuredSelection.getFirstElement();
if (object != null && object instanceof Student) {
student = (Student) object;
updateStudentView(student);
}
}
我们通过这个方法处理工作区窗口发布的选择事件,对自己感兴趣的事件进行处理,我们这里是判断发布选择事件的视图是不是StudentView.java,我们只对这个视图的选择事件感兴趣,然后将传过来的对象进行判断,如果传过来的对象是 Student ,那么让它显示在这个视图的表格中
从而实现了互动,当然,这个功能相当的简单,这里只是为了说了选择事件的用法,有兴趣的话自己可以扩展