JFace Viewer 3

来源:互联网 发布:usb网卡无法识别网络 编辑:程序博客网 时间:2024/05/17 09:38

5.1.5. StructuredViewer

StructuredViewer 是列表查看器,表格查看器,树查看器的抽象超类。(参见Figure 5-7)

 

Figure 5-7. StructuredViewer 层次图

 


下列为通常使用的API:

addDoubleClickListener(IDoubleClickListener) 为查看器添加鼠标双击监听器。

 

addDragSupport(int, Transfer[], DragSourceListener) 为查看器添加支持拖元素的操作。

 

 

addDropSupport(int, Transfer[], DropTargetListener) 为查看器添加接收释放元素到其中的支持。

 

 

addFilter(ViewerFilter) 为查看器添加过滤器,并触发查看器重新过滤和排列元素。

 

 

addHelpListener(HelpListener) 为查看器添加对帮助请求的监听器。

 

 

addOpenListener(IOpenListener) 添加对选中元素进行打开操作的监听器。

 

 

addSelectionChangedListener(ISelectionChangedListener) 为查看器添加选择元素改变监听器。

 

 

addPostSelectionChangedListener(ISelectionChangedListener) 为查看器添加选择后事件监听器。

 

getSelection() 子类实现此方法,以IStructuredSelection接口返回选中的元素。

 

 

refresh() 刷新查看器。

 

 

refresh(boolean) 刷新查看器。参数表示是否刷新已存在元素的标签。

 

refresh(Object) 从指定元素开始刷新查看器。

 

 

refresh(Object, boolean) 从指定元素开始刷新查看器。参数表示是否刷新已存在元素的标签。

 

 

resetFilters() 清除过滤器,并触发查看器重新过滤和排列元素。

 

setComparer(IElementComparer) 设置比较器来进行元素比较,如果没有设置,则默认使用元素本身的equalshashCode

 

setContentProvider(IContentProvider) 本方法会校验内容供给器为 IStructuredContentProvider

 

setData(String, Object) 设置属性和值,如果 Object设为null该属性将被删除。

 

setInput(Object) ContentViewer 实现了该方法,调用内容供给器的inputChanged方法,然后调用inputChanged 方法。 内容供给器getElements(Object) 随后将被调用,以Object作为输入参数,以决定查看器的根级元素。

 

setSelection(ISelection, boolean) StructuredViewer实现了该方法,设定查看器选中输入的元素。

 

setSorter(ViewerSorter) 设置查看器的排序器,并触发查看器重新过滤和排列元素。

 

setUseHashlookup(boolean) 设置是否在查看器中使用内部哈希表以提高元素和SWT部件的映射速度。

 

update(Object[], String[]) 更新指定元素的显示状态。

 

update(Object, String[])更新指定元素的显示状态。

 

5.1.6. ListViewer

 

ListViewer类 封装了List 控件,可以用来显示对象集合而不是字符串集合。列表查看器需要设置标签供给器和内容供给器。常用API包括:

 

add(Object) 为列表查看器加入指定元素。

 

add(Object[])为列表查看器加入指定元素。

 

getControl()返回该查看器的根源控件。

 

getElementAt(int) 根据指定位置返回相应的元素。

 

getList() 返回列表查看器的列表控件。

 

remove(Object) 删除列表查看器的指定元素。

 

remove(Object[]) 删除列表查看器的指定元素。

 

reveal(Object) 滚动查看器,保证指定元素被显示。

 

setLabelProvider(IBaseLabelProvider)列表查看器实现了该Viewer框架的方法,可以保证标签供给器为ILabelProvider

 

下面的域对象将用在以后的程序例子中。

 

public class Person {   public String firstName = "John";   public String lastName = "Doe";   public int age = 37;   public Person[] children = new Person[0];   public Person parent = null;   public Person(String firstName, String lastName,      int age) {      this.firstName = firstName;      this.lastName = lastName;      this.age = age;   }   public Person(String firstName, String lastName,      int age, Person[] children) {      this(firstName, lastName, age);      this.children = children;      for (int i = 0; i < children.length; i++) {         children[i].parent = this;      }   }   public static Person[] example() {      return new Person[] {         new Person("Dan", "Rubel", 41, new Person[] {            new Person("Beth", "Rubel", 11),            new Person("David", "Rubel", 6)}),         new Person("Eric", "Clayberg", 42, new Person[] {            new Person("Lauren", "Clayberg", 9),            new Person("Lee", "Clayberg", 7)}),         new Person("Mike", "Taylor", 55)      };   }   public String toString() {      return firstName + " " + lastName;   }}

下面的例子创建了一个列表查看器,并设置了标签供给器,内容供给器和排序器。 (参见 Figure 5-8) 注意: 要独立运行此程序, 你必须添加如下四项到你的Java Build Path (插件版本号要符合安装的Eclipse)。

 

ECLIPSE_HOME/plugins/org.eclipse.core.runtime_3.1.2.jarECLIPSE_HOME/plugins/org.eclipse.jface_3.1.1.jarECLIPSE_HOME/plugins/org.eclipse.jface.text_3.1.2.jarECLIPSE_HOME/plugins/org.eclipse.text_3.1.1.jar

import org.eclipse.jface.viewers.*;import org.eclipse.swt.*;import org.eclipse.swt.layout.*;import org.eclipse.swt.widgets.*;public class ListViewerExample {   public static void main(String[] args) {      Display display = new Display();      Shell shell = new Shell(display);      shell.setText("List Viewer Example");      shell.setBounds(100, 100, 200, 100);      shell.setLayout(new FillLayout());      final ListViewer listViewer =         new ListViewer(shell, SWT.SINGLE);      listViewer.setLabelProvider(         new PersonListLabelProvider());      listViewer.setContentProvider(         new ArrayContentProvider());      listViewer.setInput(Person.example());      listViewer.setSorter(new ViewerSorter() {         public int compare(            Viewer viewer, Object p1, Object p2) {            return ((Person) p1).lastName               .compareToIgnoreCase(((Person) p2).lastName);         }      });      listViewer.addSelectionChangedListener(         new ISelectionChangedListener() {         public void selectionChanged(            SelectionChangedEvent event) {            IStructuredSelection selection =               (IStructuredSelection) event.getSelection();            System.out.println("Selected: "               + selection.getFirstElement());         }      });      listViewer.addDoubleClickListener(         new IDoubleClickListener() {         public void doubleClick(DoubleClickEvent event)         {            IStructuredSelection selection =               (IStructuredSelection) event.getSelection();            System.out.println("Double Clicked: " +               selection.getFirstElement());         }      });      shell.open();      while (!shell.isDisposed()) {         if (!display.readAndDispatch()) display.sleep();      }      display.dispose();   }}

 

Figure 5-8. ListViewer example.

 


列表查看器创建后,使用 setLabelProvider() 方法设置标签供给器,使用setContentProvider() 设置内容供给器。 PersonListLabelProvider作为内容供给器, 返回由名字组成的文字标签,没有返回图标。该类程序如下:

 

public class PersonListLabelProvider extends LabelProvider {   public Image getImage(Object element) {      return null;   }   public String getText(Object element) {      Person person = (Person) element;      return person.firstName + " " + person.lastName;   }}

使用内建的 ArrayContentProvider最为内容供给器,它将输入的集合映射为数组。使用 setInput() 方法设置输入数据。排序器定义了compare()方法,它基于名字进行排序。最后,为列表查看器添加了selectionChanged 监听器和doubleClick监听器。

 

5.1.7. TableViewer

TableViewer 类封装了Table控件。表格查看器提供了可编辑的,垂直的,多列的条目列表。在列表中,每一个条目显示为一行单元格。每一个单元格显示了条目的相应属性。表格查看器需要配置标签供给器,内容供给器和列信息。

 

CheckboxTableViewer 加入了对个别条目泛灰的支持,还可以选中和反选与条目相关联的复选框。常用的API包括:

 

add(Object) 向表格查看器中加入指定的元素。当一个元素已经被加入到数据模型中,希望查看器能够准反映数据模型的时候,调用该方法。此方法只影响查看器,不影响数据模型。

 

add(Object[]) 向表格查看器中加入指定的元素。 当元素已经被加入到数据模型中,希望查看器能够准反映数据模型的时候,调用该方法。此方法只影响查看器,不影响数据模型。

 

cancelEditing() 取消当前起作用的单元格编辑器。

 

editElement(Object, int) 开始编辑指定元素。

 

getElementAt(int) 从表格查看器重获取指定序列号的元素。

 

getTable() 返回表格查看器的表格控件。

 

insert(Object, int) 在表格查看器的指定位置插入指定元素。

 

isCellEditorActive() 返回是否存在起作用的单元格编辑器。

 

remove(Object)从表格查看器重删除指定元素。当一个元素已经被从数据模型中删除,希望查看器能够准反映数据模型的时候,调用该方法。此方法只影响查看器,不影响数据模型。

 

remove(Object[]) 从表格查看器重删除指定元素。当元素已经被从数据模型中删除,希望查看器能够准反映数据模型的时候,调用该方法。此方法只影响查看器,不影响数据模型。

 

reveal(Object) 滚动查看器,保证指定元素被显示。

 

setCellEditors(CellEditor[])为表格查看器设置单元格编辑器。

 

setCellModifier(ICellModifier)为表格查看器设置单元格修改器。

 

setColumnProperties(String[]) 为表格查看器设置列属性。

 

setLabelProvider(IBaseLabelProvider) 表格查看器实现了Viewer 框架的此方法 保证输入的内容供给器是 ITableLabelProviderILabelProvider

 

The CheckboxTableViewer 常用API包括:

 

addCheckStateListener(ICheckStateListener)为查看器添加选中状态改变监听器。

 

getChecked(Object)返回指定元素的选中状态。

 

getCheckedElements() 返回查看器中选中元素列表。

 

getGrayed(Object)返回指定元素的泛灰状态。

 

getGrayedElements() R返回查看器中泛灰元素列表。

 

setAllChecked(boolean) 设置所有元素是否被选中。

 

setAllGrayed(boolean) 设置所有元素是否泛灰。

 

setChecked(Object, boolean) 设置指定元素是否被选中。

 

setCheckedElements(Object[]) 设置指定元素被选中。

 

setGrayed(Object, boolean) 设置指定元素是否泛灰。

 

setGrayedElements(Object[]) 设置指定元素泛灰。

 

下面的程序样例创建一个拥有四列的表格查看器。 (参见Figure 5-9)。

 

 

Figure 5-9. TableViewer 样例

 


import org.eclipse.jface.viewers.*;import org.eclipse.swt.*;import org.eclipse.swt.layout.*;import org.eclipse.swt.widgets.*;public class TableViewerExample {   public static void main(String[] args) {      Display display = new Display();      Shell shell = new Shell(display);      shell.setText("Table Viewer Example");      shell.setBounds(100, 100, 325, 200);      shell.setLayout(new FillLayout());      final TableViewer tableViewer = new TableViewer(         shell, SWT.SINGLE | SWT.FULL_SELECTION);      final Table table = tableViewer.getTable();      table.setHeaderVisible(true);      table.setLinesVisible(true);      String[] columnNames = new String[] {         "First Name", "Last Name", "Age", "Num Children"};      int[] columnWidths = new int[] {         100, 100, 35, 75};      int[] columnAlignments = new int[] {         SWT.LEFT, SWT.LEFT, SWT.CENTER, SWT.CENTER};      for (int i = 0; i < columnNames.length; i++) {         TableColumn tableColumn =            new TableColumn(table, columnAlignments[i]);         tableColumn.setText(columnNames[i]);         tableColumn.setWidth(columnWidths[i]);      }      tableViewer.setLabelProvider(         new PersonTableLabelProvider());      tableViewer.setContentProvider(         new ArrayContentProvider());      tableViewer.setInput(Person.example());      shell.open();      while (!shell.isDisposed()) {         if (!display.readAndDispatch()) display.sleep();      }      display.dispose();   }}

创建表格查看器后,调用setHeaderVisible()setLinesVisible() 方法使列表头可见,表格线可见。然后加入四列的信息。通过setText()setWidth() 方法设置列表头的文字和宽度。(参见 7.8 节, 自动调整表格列)。

 

使用 setLabelProvider()方法设置标签供给器, 使用setContentProvider() 方法设置内容供给器。标签供给器PersonTableLabelProvider, 用来返回表格每一列的文字标签,没有返回图标。 程序如下:

 

import org.eclipse.jface.viewers.*;import org.eclipse.swt.graphics.*;public class PersonTableLabelProvider   extends LabelProvider   implements ITableLabelProvider {   public Image getColumnImage(      Object element, int) {       return null;   }   public String getColumnText(Object element, int index) {      Person person = (Person) element;      switch (index) {         case 0 :            return person.firstName;         case 1 :            return person.lastName;         case 2 :            return Integer.toString(person.age);         case 3 :            return Integer.toString(person.children.length);         default :            return "unknown " + index;      }   }}