5.1.5. StructuredViewerStructuredViewer 是列表查看器,表格查看器,树查看器的抽象超类。(参见Figure 5-7)
Figure 5-7. StructuredViewer 层次图
下列为通常使用的API:
|
5.1.6. ListViewerListViewer类 封装了List 控件,可以用来显示对象集合而不是字符串集合。列表查看器需要设置标签供给器和内容供给器。常用API包括:
下面的域对象将用在以后的程序例子中。
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. TableViewerTableViewer 类封装了Table控件。表格查看器提供了可编辑的,垂直的,多列的条目列表。在列表中,每一个条目显示为一行单元格。每一个单元格显示了条目的相应属性。表格查看器需要配置标签供给器,内容供给器和列信息。CheckboxTableViewer 加入了对个别条目泛灰的支持,还可以选中和反选与条目相关联的复选框。常用的API包括:
The CheckboxTableViewer 常用API包括:
下面的程序样例创建一个拥有四列的表格查看器。 (参见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; } } } |