Eclipse SWT 查看器(七)

首先申明下,本文为笔者学习《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,继承IStructuredContentProvidergetElements()方法返回数据集合。

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,继承ILabelProvidergetImage()方法设置显示图片,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,继承ITableLabelProvidergetColumnImage()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();

内容提供者TreeContentProvidergetChildren()方法获取子节点,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,继承ITableLabelProviderILabelProvider,分别对应有无表头的情况。

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

}

显示如下
在这里插入图片描述 在这里插入图片描述

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值