`
manzhizhen
  • 浏览: 293428 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论
阅读更多
首先给出效果图:

 

 


 

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

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

   // 注意,这里要选择SWT.CHECK风格,这样表格才有复选框
  Table table = new Table(parentComposite, SWT.BORDER | SWT.FULL_SELECTION | SWT.CHECK | SWT.MULTI);
  
  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;
 }
}

  • 大小: 34.9 KB
  • 大小: 35.5 KB
分享到:
评论

相关推荐

    eclipse rcp check table

    "Check Table"在这里通常指的是带有复选框的表格视图,允许用户对表格中的每一行进行选择或操作。在Eclipse RCP应用中,这种组件常用于数据筛选、编辑或其他需要用户交互的场景。 `CheckTableViewDemo.java`可能是...

    org.eclipse.nebula.widgets.grid_1.0.0.jar_gridview_everyt8y_

    作为Eclipse项目的一部分,GridViewer与Eclipse RCP有着良好的集成,可以轻松地在RCP应用中使用,使得开发企业级桌面应用变得更加便捷。 综上所述,"org.eclipse.nebula.widgets.grid_1.0.0.jar"是Eclipse Nebula...

    eclipse官方网站上的SWT例子(用306个)

    2. **基本控件**:包括按钮(Button)、文本框(Text)、标签(Label)、复选框(CheckBox)、单选按钮(RadioButton)、滚动条(ScrollBar)等,这些都是构建用户界面的基本元素。 3. **高级控件**:例如列表(List)、树(Tree)...

    tableviewer edit

    `CellEditor` 提供了多种类型,如文本编辑器、组合框编辑器、复选框编辑器等,可以根据需要选择合适的编辑器类型。在描述“rcp tableviewer celleditor”中,"rcp"代表Eclipse RCP,强调了这个功能在RCP环境下的应用...

    Eclipse_Swt_Jface_核心应用_部分19

    9.9.2 设置带有选择框的表格 182 9.9.3 设置可同时选中多行表格 183 9.9.4 可拖动的表格 184 9.9.5 设置单元格的图标 184 9.9.6 改变选中行高亮显示的颜色 185 9.9.7 带有上下文菜单的表格 186 9.9.8 可...

    JFace-viewer

    TableViewer提供了多种列类型,如文本、复选框等,可以通过ColumnLabelProvider自定义列的显示。 - **TreeViewer**:用于展示树状结构的数据,每个节点可以有子节点。TreeViewer不仅支持基本的节点操作,还可以通过...

    SWT教程

    - **按钮(Buttons)**: 包括普通按钮、复选按钮和单选按钮,用于用户输入或触发事件。 - **文本框(Texts)**: 用于用户输入文本,支持多行文本和单行文本。 - **标签(Labels)**: 显示静态文本,可以用于提示信息...

    jface:我的表盘

    3. **表单构建**:JFace提供了表单构建器,可以方便地创建和管理表单元素,如文本框、复选框、下拉菜单等,并且支持动态表单和复杂的数据验证。 4. **树和表**:JFace对SWT的树和表组件进行了扩展,增加了更多的...

    eclipse插件开发-铺设一条插件开发普及之路(1-5章).pdf

    - **Button**:讲解按钮控件的使用,包括普通按钮、复选框和单选按钮等。 - **List**:讨论列表控件的使用,包括单选和多选列表。 - **Combo**:介绍组合框控件的使用,包括下拉列表和文本输入结合的形式。 以上是...

Global site tag (gtag.js) - Google Analytics