首页 > 代码库 > Eclipse开发插件(二)
Eclipse开发插件(二)
视图之间实现事件监听
两个视图中的组件之间的互动,在开发插件的时候是经常碰到的问题.点击视图1列表的某项时,视图2的文本框显示相应的字符.
主动式:d
主动式就是在视图1的代码块中获取对视图2的对象的引用.然后将视图1中的对象主动的传给视图2.
修改View1.java和View2.java
Eclipse通过plugin.xml来加载插件和插件中的扩展点(如视图扩展点),所以可以在View1.java中由id标识来取得视图2对象.
View1.java
1 public class View1 extends ViewPart { 2 private List list; // 将列表写成类的实例变量,以扩大它的可访问范围 3 //注意这个List并不是java.util包下的.而是org.eclipse.swt.widgets.List;包下的. 4 public void createPartControl(Composite parent) { 5 IWorkbenchHelpSystem help = PlatformUI.getWorkbench().getHelpSystem(); 6 help.setHelp(parent, "cn.com.kxh.myplugin.buttonHelpId"); 7 Composite topComp = new Composite(parent, SWT.NONE); 8 topComp.setLayout(new FillLayout()); 9 list = new List(topComp, SWT.BORDER);10 list.add("中国");11 list.add("美国");12 list.add("法国");13 // 列表选择事件监听14 list.addSelectionListener(new SelectionAdapter() {15 public void widgetSelected(SelectionEvent e) {16 // 由IWorkbenchPage获得view2对象17 IWorkbenchPage wbp = getViewSite().getPage();18 //在插件中IWorkbenchPage对象比较重要,这里再给出一种获得此对象的通用的方法.19 // Activator.getDefault().getWorkbench().getActiveWorkbenchWindow().getActivePage();20 IViewPart view2 = wbp.findView("cn.com.kxh.myplugin.View2");21 //这个地方的参数是"视图2"在plugin.xml中的id标识.由此可见plugin.xml文件在插件中的地位是极其重要的.22 // 将当前选择的列表项显示在文本框中23 Text text = ((View2) view2).getText();24 text.setText(list.getSelection()[0]);25 }26 });27 }28 @Override29 public void setFocus() {}30 }
View2.java (将View2.java的文本框对象改成类的实例变量,并编写相应的Setter和Getter方法)
1 public class View2 extends ViewPart { 2 private Text text; 3 public void createPartControl(Composite parent) { 4 Composite topComp = new Composite(parent,SWT.NONE); 5 topComp.setLayout(new FillLayout()); 6 text = new Text(topComp,SWT.BORDER); 7 text.setText("我是Text框"); 8 } 9 public void setFocus() {}10 11 public Text getText() {12 return text;13 }14 public void setText(Text text) {15 this.text = text;16 }17 }
SamplePerspective.java(和我的上一篇博客上没有做任何修改)
1 public class SamplePerspective implements IPerspectiveFactory { 2 // 参数IPageLayout是用于透视图的布局管理器 3 public void createInitialLayout(IPageLayout layout) { 4 // 得到本透视图的编辑空间标识 5 String editorArea = layout.getEditorArea(); 6 // 在透视图左部创建一个空间,并将“视图1”放入其中。 7 // "left"是此空间的标识;IPageLayout.LEFT指出此空间在透视图布局中的位置靠左; 8 // 0.2f 指此空间占用透视图20%的宽度;editorArea 指使用透视图的编辑空间 9 IFolderLayout left = layout.createFolder("left", IPageLayout.LEFT, 0.2f, editorArea);10 left.addView("cn.com.kxh.myplugin.View1"); // 参数为plugin.xml中“视图1”的id标识11 // 将“视图2”加入到透视图的底部12 IFolderLayout bottom = layout.createFolder("bottom", IPageLayout.BOTTOM, 0.8f, editorArea);13 bottom.addView(View2.class.getName());// 由于我们把视图的id取成和类全名一样,所以也可以用这种写法14 // 将以前定义的actionset(主菜单、工具栏按钮)加入到本透视图。这要在plugin.xml文15 // 件的action设置中将visible="false"才看得出效果,这时打开其他透视图,action设置的16 // 主菜单、工具栏按钮将不会出现在界面上,只有打开本透视图才会出现。17 layout.addActionSet("myplugin.actionSet");// 参数为actionSet在plugin.xml中的id标识18 }19 }
总结:
(1)在插件中IWorkbenchPage对象比较重要,这里再给出一种获得此对象的通用方法,不过他是获得当前活动的IWorkbenchPage对象.
Activator.getDefault().getWorkbench().getActiveWorkbenchWindow().getActivepage();
(2)IWorkbenchPage.findView("cn.com.kxh.myplugin.View2")中的参数为"视图2"在plugin.xml中设置的id标识.
由此可见.plugin.xml文件在插件中的地位是及其重要的.IWorkbenchPage处理findView方法之外.还用findEditor方法来得到编辑器对象.像"cn.com.kxh.myplugin.View2"这种标识符在系统开发中会经常用到,最好建立一个类来集中放置这些字符串常量.然后系统中用的时候只用其常量名即可,否则把标识符的字串分散在代码中,以后改起来会非常麻烦.常量类的示例代码如下:
public final class StringConstants{ public final static String VIEW1="cn.com.kxh.myplugin.View1"; public final static String VIEW2=View2.class.getName();}
要用的时候时候直接类名点调用就可以了.
附上上面代码的运行结果.
Eclipse开发插件(二)