Plug-in JFace查看器

来源:互联网 发布:网络串口服务器 编辑:程序博客网 时间:2024/06/05 11:13

Plug-in JFace查看器

首先申明下,本文为笔者学习《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;@Overridepublic Object[] getElements(Object inputElement) {if (inputElement instanceof ModelList) {return ((ModelList)inputElement).getElements();}return new Object[0];}@Overridepublic 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);}}@Overridepublic 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 {@Overridepublic void addListener(ILabelProviderListener listener) {}@Overridepublic void dispose() {}@Overridepublic boolean isLabelProperty(Object element, String property) {return false;}@Overridepublic void removeListener(ILabelProviderListener listener) {}@Overridepublic Image getImage(Object element) {return null;}@Overridepublic String getText(Object element) {if (element instanceof Student)return ((Student) element).getName();return null;}}

显示如下


3、TableViewer

TableViewer是表格查看器,setHeaderVisible方法设置是否显示表头,setLinesVisible方法设置是否显示网格。
SWT.CHECK样式会在表格每行开头显示复选框。当选择行时,FULL_SELECTION样式表示整行都会高亮。SWT.SIMPLE/SWT.MUlTI样式代表选择单行或多行。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"));}@Overridepublic void addListener(ILabelProviderListener listener) {}@Overridepublic void dispose() {image.dispose();}@Overridepublic boolean isLabelProperty(Object element, String property) {return false;}@Overridepublic void removeListener(ILabelProviderListener listener) {}@Overridepublic Image getColumnImage(Object element, int columnIndex) {if (columnIndex == 0) {return image;}return null;}@Overridepublic 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;@Overridepublic Object[] getElements(Object inputElement) {if (inputElement instanceof ModelList) {return ((ModelList) inputElement).getElements();}return new Object[0];}@Overridepublic Object[] getChildren(Object parentElement) {if (parentElement instanceof Teacher) {return ((Teacher) parentElement).getStudents().toArray();}return new Object[0];}@Overridepublic Object getParent(Object element) {if (element instanceof Student) {return ((Student) element).getTeacher();}return null;}@Overridepublic boolean hasChildren(Object element) {if (element instanceof Teacher) {return !((Teacher) element).getStudents().isEmpty();}return false;}@Overridepublic 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);}}@Overridepublic 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 {@Overridepublic void addListener(ILabelProviderListener listener) {}@Overridepublic void dispose() {}@Overridepublic boolean isLabelProperty(Object element, String property) {return false;}@Overridepublic void removeListener(ILabelProviderListener listener) {}@Overridepublic Image getColumnImage(Object element, int columnIndex) {return null;}@Overridepublic 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;}@Overridepublic Image getImage(Object element) {return null;}@Overridepublic String getText(Object element) {if (element instanceof Student) {return ((Student) element).getName();} else if (element instanceof Teacher) {return ((Teacher) element).getName();}return null;}}

显示如下

        
0 0
原创粉丝点击