JFace Viewer 3

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) 设置比较器来进行元素比较,如果没有设置,则默认使用元素本身的equals 和 hashCode。

 

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.jar
ECLIPSE_HOME/plugins/org.eclipse.jface_3.1.1.jar
ECLIPSE_HOME/plugins/org.eclipse.jface.text_3.1.2.jar
ECLIPSE_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 框架的此方法 保证输入的内容供给器是 ITableLabelProvider 或 ILabelProvider。

 

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;
      }
   }
}

你可能感兴趣的:(eclipse,object,String,shell,table,import)