首先申明下,本文为笔者学习《Eclipse插件开发学习笔记》的笔记,并加入笔者自己的理解和归纳总结。
1. 查看器
在查看器Viewer
中,模型被称为input
,查看器充当控制器的角色,而控件本身作为视图。当输入改变时,查看器负责改变控件的内容。
模型类ModelList
,
public class ModelList {
public final static String PROPERTY_NAME_ADD = "add";
public final static String PROPERTY_NAME_REMOVE = "remove";
private List<Object> mData = new ArrayList<Object>();
private PropertyChangeSupport mSupport = new PropertyChangeSupport(this);
public void addObject(Object data) {
if (mData.add(data)) {
mSupport.firePropertyChange(PROPERTY_NAME_ADD, null, data);
}
}
public void removeObject(Object data) {
if (mData.remove(data)) {
mSupport.firePropertyChange(PROPERTY_NAME_REMOVE, data, null);
}
}
public Object[] getElements() {
return mData.toArray();
}
public void addPropertyChangeListener(PropertyChangeListener listener) {
mSupport.addPropertyChangeListener(listener);
}
public void removePropertyChangeListener(PropertyChangeListener listener) {
mSupport.removePropertyChangeListener(listener);
}
}
Student
数据类,
public class Student {
public String mName;
private int mAge;
private Teacher mTeacher;
public Student(String name) {
this.mName = name;
}
public Student(String name, int age) {
this.mName = name;
this.mAge = age;
}
public Student(String name, int age, Teacher teacher) {
this.mName = name;
this.mAge = age;
this.mTeacher = teacher;
}
public String getName() {
return mName;
}
public int getAge() {
return mAge;
}
public Teacher getTeacher() {
return mTeacher;
}
}
Teacher
数据类,
public class Teacher {
private String mName;
private List<Student> mStudList = new ArrayList<Student>();
public Teacher(String name) {
this.mName = name;
}
public String getName() {
return mName;
}
public void addStudent(Student stud) {
mStudList.add(stud);
}
public List<Student> getStudents() {
return mStudList;
}
}
2. ListViewer
ListViewer
是列表查看器,调用setInput()
方法将数据模型传递给查看器后。
查看器会把模型传递给内容提供者IContentProvider.inputChanged()
方法。
内容提供者则需要向数据模型上注册监听器。
shell.setLayout(new FillLayout());
ListViewer listViewer = new ListViewer(shell, SWT.BORDER);
listViewer.setContentProvider(new ListContentProvider());
listViewer.setLabelProvider(new ListLabelProvider());
ModelList modelList = new ModelList();
listViewer.setInput(modelList);
modelList.addObject(new Student("Tome"));
modelList.addObject(new Student("Jack"));
modelList.addObject(new Student("Lily"));
modelList.addObject(new Student("Mike"));
内容提供者ListContentProvider
,继承IStructuredContentProvider
,getElements()
方法返回数据集合。
public class ListContentProvider implements IStructuredContentProvider, PropertyChangeListener {
private Viewer viewer;
@Override
public Object[] getElements(Object inputElement) {
if (inputElement instanceof ModelList) {
return ((ModelList)inputElement).getElements();
}
return new Object[0];
}
@Override
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
this.viewer = viewer;
if (oldInput instanceof ModelList) {
((ModelList) oldInput).removePropertyChangeListener(this);
}
if (newInput instanceof ModelList) {
((ModelList) newInput).addPropertyChangeListener(this);
}
}
@Override
public void propertyChange(PropertyChangeEvent evt) {
if (ModelList.PROPERTY_NAME_ADD.equals(evt.getPropertyName())) {
viewer.refresh();
} else if (ModelList.PROPERTY_NAME_REMOVE.equals(evt.getPropertyName())) {
viewer.refresh();
}
}
}
标签提供者ListLabelProvider
,继承ILabelProvider
,getImage()
方法设置显示图片,getText()
方法设置显示文字。
public class ListLabelProvider implements ILabelProvider {
@Override
public void addListener(ILabelProviderListener listener) {
}
@Override
public void dispose() {
}
@Override
public boolean isLabelProperty(Object element, String property) {
return false;
}
@Override
public void removeListener(ILabelProviderListener listener) {
}
@Override
public Image getImage(Object element) {
return null;
}
@Override
public String getText(Object element) {
if (element instanceof Student)
return ((Student) element).getName();
return null;
}
}
显示如下
3. TableViewer
TableViewer
是表格查看器,setHeaderVisible()
方法设置是否显示表头,setLinesVisible()
方法设置是否显示网格。
SWT.CHECK
样式会在表格每行开头显示复选框。当选择行时,SWT.FULL_SELECTION
样式表示整行都会高亮。SWT.SIMPLE/SWT.MUlTI
样式代表选择单行或多行。SWT.HIDE_SELECTION
样式表示表格失去焦点时不显示选择的行,否则该行是灰色。
TableColumn
被用来设置表头,setText()
方法设置文本,setImage()
方法设置图片,setWidth()
方法设置宽度。
Image image = new Image(display, TableViewerDemo.class.getResourceAsStream("demo.gif"));
shell.setLayout(new FillLayout());
TableViewer tableViewer = new TableViewer(shell,
SWT.BORDER|SWT.CHECK|SWT.FULL_SELECTION|SWT.MULTI);
tableViewer.setContentProvider(new ListContentProvider());
tableViewer.setLabelProvider(new TableLabelProvider());
Table table = tableViewer.getTable();
TableColumn column1 = new TableColumn(table, SWT.NONE);
column1.setText("name");
column1.setImage(image);
column1.setWidth(120);
TableColumn column2 = new TableColumn(table, SWT.NONE);
column2.setWidth(80);
column2.setText("age");
column2.setImage(image);
table.setHeaderVisible(true);
table.setLinesVisible(true);
ModelList modelList = new ModelList();
tableViewer.setInput(modelList);
modelList.addObject(new Student("Tome", 24));
modelList.addObject(new Student("Jack", 19));
modelList.addObject(new Student("Lily", 30));
modelList.addObject(new Student("Mike", 41));
... ...
image.dispose();
内容提供者仍然使用ListContentProvider
。标签提供者TableLabelProvider
,继承ITableLabelProvider
。getColumnImage()
和getColumnText()
分别提供图片和文字。
public class TableLabelProvider implements ITableLabelProvider {
private Image image;
public TableLabelProvider() {
image = new Image(Display.getDefault(),
TableLabelProvider.class.getResourceAsStream("demo.gif"));
}
@Override
public void addListener(ILabelProviderListener listener) {
}
@Override
public void dispose() {
image.dispose();
}
@Override
public boolean isLabelProperty(Object element, String property) {
return false;
}
@Override
public void removeListener(ILabelProviderListener listener) {
}
@Override
public Image getColumnImage(Object element, int columnIndex) {
if (columnIndex == 0) {
return image;
}
return null;
}
@Override
public String getColumnText(Object element, int columnIndex) {
if (element instanceof Student) {
Student stud = (Student) element;
if (columnIndex == 0) {
return stud.getName();
} else if (columnIndex == 1) {
return Integer.toString(stud.getAge());
}
}
return null;
}
}
显示如下
4. TreeViewer
TreeViewer
是树查看器,适合于显示层级化的数据。
shell.setLayout(new FillLayout());
TreeViewer treeViewer = new TreeViewer(shell, SWT.BORDER);
treeViewer.setContentProvider(new TreeContentProvider());
treeViewer.setLabelProvider(new TreeLabelProvider());
/** 设置树的头部
Tree tree = treeViewer.getTree();
TreeColumn col1 = new TreeColumn(tree, SWT.NONE);
col1.setText("Teacher");
col1.setWidth(80);
TreeColumn col2 = new TreeColumn(tree, SWT.NONE);
col2.setText("Student");
col2.setWidth(80);
tree.setHeaderVisible(true);
tree.setLinesVisible(true);
*/
ModelList modelList = new ModelList();
treeViewer.setInput(modelList);
Teacher t1 = new Teacher("Mike");
t1.addStudent(new Student("Jack", 18, t1));
t1.addStudent(new Student("Lily", 26, t1));
t1.addStudent(new Student("Tom", 20, t1));
modelList.addObject(t1);
Teacher t2 = new Teacher("Lily");
t2.addStudent(new Student("Tom", 23, t2));
t2.addStudent(new Student("Jack", 29, t2));
modelList.addObject(t2);
treeViewer.expandAll();
内容提供者TreeContentProvider
,getChildren()
方法获取子节点,getParent()
方法获取父节点
public class TreeContentProvider implements ITreeContentProvider, PropertyChangeListener {
private Viewer viewer;
@Override
public Object[] getElements(Object inputElement) {
if (inputElement instanceof ModelList) {
return ((ModelList) inputElement).getElements();
}
return new Object[0];
}
@Override
public Object[] getChildren(Object parentElement) {
if (parentElement instanceof Teacher) {
return ((Teacher) parentElement).getStudents().toArray();
}
return new Object[0];
}
@Override
public Object getParent(Object element) {
if (element instanceof Student) {
return ((Student) element).getTeacher();
}
return null;
}
@Override
public boolean hasChildren(Object element) {
if (element instanceof Teacher) {
return !((Teacher) element).getStudents().isEmpty();
}
return false;
}
@Override
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
this.viewer = viewer;
if (oldInput instanceof ModelList) {
((ModelList) oldInput).removePropertyChangeListener(this);
}
if (newInput instanceof ModelList) {
((ModelList) newInput).addPropertyChangeListener(this);
}
}
@Override
public void propertyChange(PropertyChangeEvent evt) {
if (ModelList.PROPERTY_NAME_ADD.equals(evt.getPropertyName())) {
viewer.refresh();
} else if (ModelList.PROPERTY_NAME_REMOVE.equals(evt.getPropertyName())) {
viewer.refresh();
}
}
}
标签提供者TreeLabelProvider
,继承ITableLabelProvider
和ILabelProvider
,分别对应有无表头的情况。
public class TreeLabelProvider implements ITableLabelProvider, ILabelProvider {
@Override
public void addListener(ILabelProviderListener listener) {
}
@Override
public void dispose() {
}
@Override
public boolean isLabelProperty(Object element, String property) {
return false;
}
@Override
public void removeListener(ILabelProviderListener listener) {
}
@Override
public Image getColumnImage(Object element, int columnIndex) {
return null;
}
@Override
public String getColumnText(Object element, int columnIndex) {
if (element instanceof Student) {
if (columnIndex == 1) {
return ((Student) element).getName();
}
} else if (element instanceof Teacher) {
if (columnIndex == 0) {
return ((Teacher) element).getName();
}
}
return null;
}
@Override
public Image getImage(Object element) {
return null;
}
@Override
public String getText(Object element) {
if (element instanceof Student) {
return ((Student) element).getName();
} else if (element instanceof Teacher) {
return ((Teacher) element).getName();
}
return null;
}
}
显示如下