Eclipse插件开发5-Jface

JFace是建立在SWT之上的UI部件,是Eclipse组织为了开发Eclipse IDE环境所编写的一组底层图形界面 API,其底层实现为SWT。它扩展了 SWT并能与 SWT 交互操作。JFace工具箱提供了一组功能强大的用户界面组件,开发人员可以轻松地在独立应用程序中利用这些组件,以简化常见的UI编程任务。
SWT是一个窗口构件集和图形库,它集成于本机操作系统提供的GUI API。而JFace是用SWT实现的UI工具箱,它简化了常见的UI编程任务。JFace在其API和实现方面都是独立于窗口系统的,它在窗口小部件系统上运行,即JFace旨在使用SWT而不隐藏它。

     SWT提供了一些简单的组件,Jface  提供比较复杂的组件用以展示一些比较复杂的数据对象,而不是简单的字符串等类型,为了让Jface能够识别复杂点的数据类型我们需要实现2个方法去兼容Jface组件,分别是setContentProvider和setLabelProvider,一个是内容提供者一个是标签提供者,为了更加清楚的搞懂这些,下面我们使用Jface的TableViewer做一个例子就明白了

    首先我们可以利用前面文章中提到的插件项目,做一个视图的扩展

     点击plugin.xml的Extensions标签,选择ADD然后输入views,选中org.eclipse.ui.views和下面的sample view

   

点击下一步 去掉最后2个勾 (视图的帮助内容和创建一个透视图,我们目前不需要);



 点击完成,然后会生成一个类SampleView.java (视图的类 继承自ViewPart),并在pugin.xml增加了一个extension扩展点 是对这个视图的描述;我们目前不需要这么多功能 所以将 SampleView类删除,重新建一个SampleView继承自ViewPart 它只包含了2个方法;

    (1)我们需要建一个模型类 比如Book  包含id,name,author,price属性,并加上GET/SET方法

     (2)新建一个内容提供者类ViewContentProvider 继承自IStructuredContentProvider  我们要重写它的

getElements方法为TabelViewer提供数据

          @Override
 public Object[] getElements(Object arg0) {
  // TODO Auto-generated method stub
  Book[] books = new Book[2];
  books[0] = new Book();
  books[0].setId(1);
  books[0].setName("JAVA");
  books[0].setAuthor("张三");
  books[0].setPrice("50");
  
  books[1] = new Book();
  books[1].setId(2);
  books[1].setName("C++");
  books[1].setAuthor("李四");
  books[1].setPrice("55");
  return books;
 }

(3)接着新建标签提供者类ViewLabelProvider继承自LabelProvider并实现ITableLabelProvider

   我们需要重写getColumnText方法,类根据数据模型提供界面的显示内容

     @Override
 public String getColumnText(Object arg0, int arg1) {
  // TODO Auto-generated method stub
  Book book = (Book)arg0;
  switch (arg1) {
  case 0:
   return book.getId()+"";
  case 1:
   return book.getName();
  case 2:
   return book.getAuthor();
  case 3:
   return book.getPrice();
  default:
   return "unknow"+arg1;
  }
 }

(4)我们要填充SampleView类的相关信息

 @Override
 public void createPartControl(Composite parent) {
  // TODO Auto-generated method stub
  TableViewer viewer = new TableViewer(parent,SWT.SINGLE|SWT.FULL_SELECTION);
        Table table = viewer.getTable();
        table.setHeaderVisible(true);
        table.setLinesVisible(true);
       
        String[] columnNames = new String[]{"id","name","author","price"};
        int[] columnWidths = new int[]{100,100,100,100};
        int[] columnAlignments = new int[]{SWT.LEFT,SWT.LEFT,SWT.LEFT,SWT.LEFT};
        for(int i=0;i<columnNames.length;i++){
            TableColumn tableColumn  = new TableColumn(table,columnAlignments[i]);
            tableColumn.setText(columnNames[i]);
            tableColumn.setWidth(columnWidths[i]);
        }
       
        viewer.setContentProvider(new ViewContentProvider());//设置内容提供者
        viewer.setLabelProvider(new ViewLabelProvider());//设置标签提供者
        viewer.setInput(getSite());//设置输入,这里暂且设置为getSite()
 }
接着运行插件,在新打开的eclipse中点击window 菜单show views 有一个Sample Category下面Sample View点击它,就可以看见下图了,这就是一个简单的tableviewer的用法,关键是要Jface理解复杂数据类型

中需要实现的2个提供者;



 当然上面扩展视图的时候也可以直接将XML文件新增部分 自己编写,跟在extension标签页中是同样的效果,前提是你比较熟悉各个节点的意思。

猜你喜欢

转载自zrgzrgzrgzrg.iteye.com/blog/2274355