首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

RCP中带复选框的报表应用

2012-06-29 
RCP中带复选框的表格应用首先给出效果图:???本例主要使用的是JFace中的CheckboxTableViewer,废话少说,直接

RCP中带复选框的表格应用
首先给出效果图:

?
RCP中带复选框的报表应用

?


RCP中带复选框的报表应用

?

本例主要使用的是JFace中的CheckboxTableViewer,废话少说,直接上代码:

?/**
? * 创建一个带复选框的表格
? */
?public void createCheckTable() {

???// 注意,这里要选择SWT.CHECK风格,这样表格才有复选框
??Table table = new Table(parentComposite, SWT.BORDER | SWT.FULL_SELECTION | SWT.CHECK);
??
??FormData fd_table = new FormData();
??fd_table.top = new FormAttachment(0, 5);
??fd_table.left = new FormAttachment(0, 5);
??fd_table.right = new FormAttachment(100, -5);
??fd_table.bottom = new FormAttachment(100, -25);
??table.setLayoutData(fd_table);
??
??TableColumn choice = new TableColumn(table, SWT.BORDER);
??choice.setText("选择");
??choice.setWidth(50);
??choice.setAlignment(SWT.CENTER);
??
??TableColumn columnID = new TableColumn(table, SWT.BORDER);
??columnID.setText("姓名");
??columnID.setWidth(70);
??columnID.setAlignment(SWT.CENTER);
??
??TableColumn columnName = new TableColumn(table, SWT.CENTER);
??columnName.setText("性别");
??columnName.setWidth(70);
??columnName.setAlignment(SWT.CENTER);
??
??TableColumn department = new TableColumn(table, SWT.BORDER);
??department.setAlignment(SWT.CENTER);
??department.setText("部门");
??department.setWidth(140);
??
??TableColumn ideal = new TableColumn(table, SWT.BORDER);
??ideal.setAlignment(SWT.CENTER);
??ideal.setText("理想");
??ideal.setWidth(140);
??
??table.setHeaderVisible(true);?// 设置列栏可见
??table.setLinesVisible(true);?// 设置表格线可见
??
??checkboxTableViewer = new CheckboxTableViewer(table);


??// 为表格设置内容提供者
??checkboxTableViewer.setContentProvider(new ArrayContentProvider());

?// 为表格设置标签提供者,最下面给出代码
??checkboxTableViewer.setLabelProvider(new CheckTableLabelProvider());

? //?为表格填充数据,peopleList的类型是List<PeopleModel>
??checkboxTableViewer.setInput(peopleList);
??
??selectAllButton = new Button(parentComposite, SWT.CHECK); ?//全选的复选框按钮
??
??FormData fd_selectAllButton = new FormData();
??fd_selectAllButton.top = new FormAttachment(table, 6);
??fd_selectAllButton.left = new FormAttachment(table, 0, SWT.LEFT);
??selectAllButton.setLayoutData(fd_selectAllButton);
??
??selectAllButton.setText("全选");
??
??// 创建表格的事件
??createTableEvent();
??
??// 创建全选按钮的事件
??createCheckBoxEvent();
?}

?

下面给出事件的代码,此例的表格可以进行多选。

?/**
? * 创建表格的响应事件
? */
?private void createTableEvent() {
??// 双击表格某一行,改变该行的复选框状态
??checkboxTableViewer.addDoubleClickListener(new IDoubleClickListener(){
???@Override
???public void doubleClick(DoubleClickEvent event) {
????IStructuredSelection selection = (IStructuredSelection) event.getSelection();
????Object obj = selection.getFirstElement();
????if(obj instanceof PeopleModel) {
?????checkboxTableViewer.setChecked(obj,
???????!checkboxTableViewer.getChecked(obj));
?????
?????// 注意,即使你添加了CheckStateListener监听,这里还是要手动改变复选框的状态
?????changeCheckBoxState();
????}
???}
??});
??
??// 根据表格的状态来改变全选按钮的状态
??checkboxTableViewer.addCheckStateListener(new ICheckStateListener() {
???
???@Override
???public void checkStateChanged(CheckStateChangedEvent event) {
????changeCheckBoxState();
???}
??});
?}
?
?/**
? * 创建复选框监听事件
? */
?public void createCheckBoxEvent() {
??selectAllButton.addSelectionListener(new SelectionAdapter() {
????selectAllButton.addPaintListener(new PaintListener() {
???@Override
???public void paintControl(PaintEvent e) {
????tableViewer.setAllChecked(selectAllButton.getSelection());
???}
???});
?}
?
?/**
? * 更改复选框状态
? */
?public void changeCheckBoxState() {
??if(checkboxTableViewer.getTable().getItemCount() ==
????checkboxTableViewer.getCheckedElements().length) {
???selectAllButton.setSelection(true);
??} else {
???selectAllButton.setSelection(false);
??}
?}

?

可以用下面的方法获得表格中所选择的行对象:

?/**
? * 返回表格中所选择的PeopleModel对象列表
? * 返回的是复选框被勾选的行,如果没有被选择的行,则返回null
? * @return? List<PeopleModel>
? */
?public List<PeopleModel> getSelection() {
??Object[] objects = checkboxTableViewer.getCheckedElements();
??
??List<PeopleModel> list = new ArrayList<PeopleModel>();
??for(Object obj : objects) {
???if(obj instanceof PeopleModel) {
????list.add((PeopleModel) obj);
???}
??}
??
??return (list.size() == 0 ? null: list);
?}

?

这样表格就可以进行多选了,如果你需要单选,即最多选择一行,可以修改如下:

?

?/**
? * 创建表格的响应事件
? */
?private void createTableEvent() {
??// 双击表格某一行,改变该行的复选框状态
??checkboxTableViewer.addDoubleClickListener(new IDoubleClickListener(){
???@Override
???public void doubleClick(DoubleClickEvent event) {
????IStructuredSelection selection = (IStructuredSelection) event.getSelection();
????Object obj = selection.getFirstElement();
????
????// 如果该表格只能进行单选,则应该用如下代码:
????if(obj instanceof PeopleModel) {
?????// 如果该行以前是选中状态,则现在把它变为不选中即可
?????if(checkboxTableViewer.getChecked(obj)) {
??????checkboxTableViewer.setChecked(obj, false);
??????
??????// 否则,先让所有行都未选中,然后再选中这一行,以保证单选
?????} else {
??????checkboxTableViewer.setAllChecked(false);
??????checkboxTableViewer.setChecked(obj, true);
?????}
????}
????
???}
??});
??
??// 根据表格的状态来改变全选按钮的状态
??checkboxTableViewer.addCheckStateListener(new ICheckStateListener() {
???
???@Override
???public void checkStateChanged(CheckStateChangedEvent event) {
????// 如果用户使该行的状态变为了选中
????if(event.getChecked()) {
?????// 选取消所有行的选中
?????checkboxTableViewer.setAllChecked(false);
?????// 然后再选中该行
?????checkboxTableViewer.setChecked(event.getElement(), true);
????}
???}
??});
?}

?

?

附录:

// 表格所绑定的数据模型类

public class PeopleModel {
?private String name;
?private String sex;
?private String department;
?private String ideal;

?public PeopleModel(String name, String sex, String department, String ideal) {
??this.name = name;
??this.sex = sex;
??this.department = department;
??this.ideal = ideal;
?}
?
?public String getName() {
??return name;
?}

?public void setName(String name) {
??this.name = name;
?}

// 其他成员变量的set、get方法

。。。。。。

}

?

?// 表格所使用的标签提供者

class CheckTableLabelProvider extends LabelProvider implements ITableLabelProvider {

?@Override
?public Image getColumnImage(Object element, int columnIndex) {
??return null;
?}

?@Override
?public String getColumnText(Object element, int columnIndex) {
??if(element instanceof PeopleModel) {
???PeopleModel peopleModel = (PeopleModel) element;
???
???switch(columnIndex) {
???case 0:
????return "";
???
???case 1:
????return peopleModel.getName();
???
???case 2:
????return peopleModel.getSex();
????
???case 3:
????return peopleModel.getDepartment();
????
???case 4:
????return peopleModel.getIdeal();
???}
??}
??
??return null;
?}
}

热点排行