zoukankan      html  css  js  c++  java
  • jface的CheckboxTreeViewer实现单选

    需求:使用FilteredTree实现一个下面这样的Dialog,要求Check框单选,即只能选择一个:当选择新的时候,旧的不选。说明:FilteredTree自带一个文本输入框。

    1、自己的类继承org.eclipse.jface.dialogs.Dialog

    2、在createDialogArea方法中实现自己的窗体:

     1 protected Control createDialogArea(Composite parent) {
     2         Composite composite = new Composite(parent,SWT.NULL);
     3         composite.getShell().setText("****选择");
     4         
     5         composite.setLayout(new GridLayout(1,false));
     6         GridData compositeGridData = new GridData(GridData.FILL_BOTH);
     7         composite.setLayoutData(compositeGridData);
     8         
     9         Label title = new Label(composite,SWT.NONE);
    10         title.setAlignment(SWT.LEFT);
    11         title.setText("可选**信息");
    12         title.setLayoutData(new GridData(SWT.LEFT,SWT.TOP,false,false,1,1));
    13         
    14         ChooseProjectEntryFilteredTree filteredTree = new ChooseProjectEntryFilteredTree(
    15                 composite,
    16                 SWT.BORDER,
    17                 new ChooseProjectEntryPatternFilter(),
    18                 true);
    19         this.treeViewer = filteredTree.getViewer();
    20         //this.treeViewer.setUseHashlookup(true);
    21         
    22         this.tree = this.treeViewer.getTree();
    23         this.tree.setToolTipText("请输入***的关键词");
    24         
    25         this.checkboxTreeViewer = new CheckboxTreeViewer(this.tree);
    26         
    27         GridData gd = new GridData(SWT.FILL,SWT.FILL,true,false,1,1);
    28         gd.heightHint = 250;
    29         this.tree.setLayoutData(gd);
    30         this.tree.setLinesVisible(true);
    31         this.tree.setHeaderVisible(true);
    32         
    33         TreeColumn funcDecl = new TreeColumn(this.tree,SWT.CENTER);
    34         funcDecl.setText("****");
    35         funcDecl.setWidth(240);
    36         funcDecl.addSelectionListener(new SelectionAdapter() {
    37             boolean sortType = true;
    38 
    39             @Override
    40             public void widgetSelected(SelectionEvent e) {
    41                 sortType = !sortType;
    42                 treeViewer.setSorter(sortType ? ChooseProjectEntrySorter.sorter
    43                         : ChooseProjectEntrySorter.reverseSorter);
    44             }
    45             
    46             
    47         });
    48         
    49         TreeColumn file = new TreeColumn(this.tree,SWT.CENTER);
    50         file.setText("****");
    51         file.setWidth(270);
    52         
    53         TreeColumn line = new TreeColumn(this.tree,SWT.CENTER);
    54         line.setText("***");
    55         line.setWidth(100);
    56         
    57         treeViewer.setContentProvider(new ChooseProjectEntryContentProvider());
    58         treeViewer.setLabelProvider(new ChooseProjectEntryLabelProvider());
    59         treeViewer.setSorter(ChooseProjectEntrySorter.sorter);
    60         treeViewer.setInput(manager);
    61         
    62         this.selectedLabel = new Label(composite,SWT.NONE);
    63         this.selectedLabel.setAlignment(SWT.LEFT);
    64         GridData labelGd = new GridData(SWT.LEFT,SWT.TOP,true,false,1,1);
    65         labelGd.widthHint = 380;
    66         this.selectedLabel.setLayoutData(labelGd);
    67         
    68         this.checkboxTreeViewer.addCheckStateListener(checkStateListener);
    69         
    70         //this.treeViewer.addSelectionChangedListener(listener);
    71         return null;
    72     }
    代码如下:

    说明:

    treeViewer.setContentProvider(new ChooseProjectEntryContentProvider());
            treeViewer.setLabelProvider(new ChooseProjectEntryLabelProvider());
            treeViewer.setSorter(ChooseProjectEntrySorter.sorter);
            treeViewer.setInput(manager);

    这里设置的是TreeViewer的content provider和label provider、sorter,所以并不能正常使用checkboxTreeViewer.setChecked()和setSubtreeChecked(),并不能像这个链接中那样设置指定行的checked状态为false,所以需要使用下面的方法:

    1)、checkboxTreeViewer监听事件:

     1     /**
     2      * 单选表格
     3      */
     4     private ICheckStateListener checkStateListener = new ICheckStateListener(){
     5         @Override
     6         public void checkStateChanged(CheckStateChangedEvent event) {
     7             if (event.getChecked()) {
     8                 setAllCheckedFalse();
     9                 //checkboxTreeViewer.setChecked(getTreeItem(event.getElement()), true);
    10                 checkFunc = (FuncItem)(event.getElement());
    11                 TreeItem item = getTreeItem(checkFunc);
    12                 if(item != null){
    13                     item.setChecked(true);
    14                 }
    15                 selectedLabel.setText("已选**:" + checkFunc.***);
    16             }else{
    17                 checkFunc = null;
    18             }
    19             
    20             treeViewer.refresh();
    21         }
    22         
    23     };
    代码如下:

    2)、设置所有checked的行为unchecked状态:

     1 /**
     2      * 设置所有被checked的选项unchecked
     3      */
     4     private void setAllCheckedFalse(){
     5         TreeItem[] items = this.tree.getItems();
     6         
     7         if(items.length > 0){
     8             for(int i = 0; i < items.length; i ++){
     9                 TreeItem item = items[i];
    10                 item.setChecked(false);
    11             }
    12         }
    13     }
    代码如下:

    3)、getTreeItem函数:

     1 private TreeItem getTreeItem(FuncItem element){
     2         TreeItem[] items = this.tree.getItems();
     3         
     4         if(items.length > 0){
     5             for(int i = 0; i < items.length; i ++){
     6                 TreeItem item = items[i];
     7                 if(element.equals((FuncItem)item.getData())){
     8                     return item;
     9                 }
    10             }
    11         }
    12         
    13         return null;
    14     }
    代码如下:

    3、贴一下ChooseProjectEntryFilteredTree的代码

     1 /**
     2  * 自行导入需要的包
     3  */
     4 public class ChooseProjectEntryFilteredTree extends FilteredTree {
     5 
     6     public ChooseProjectEntryFilteredTree(Composite parent, int treeStyle,
     7             PatternFilter filter, boolean useNewLook) {
     8         super(parent, treeStyle, filter, useNewLook);
     9     }
    10 
    11     @Override
    12     protected TreeViewer doCreateTreeViewer(Composite parent, int style) {
    13         return super.doCreateTreeViewer(parent, SWT.CHECK | SWT.SINGLE | SWT.BORDER
    14                 | SWT.V_SCROLL | SWT.H_SCROLL);
    15     }
    16 
    17     
    18 }
    代码如下:

    4、贴一下ChooseProjectEntryPatternFilter的代码

     1 public class ChooseProjectEntryPatternFilter extends PatternFilter {
     2 
     3     @Override
     4     protected boolean isLeafMatch(Viewer viewer, Object element) {
     5         TreeViewer treeViewer = (TreeViewer) viewer;
     6         
     7         int numberOfColumns = treeViewer.getTree().getColumnCount();
     8         
     9         ITableLabelProvider labelProvider = (ITableLabelProvider) treeViewer
    10                 .getLabelProvider();
    11         
    12         boolean isMatch = false;
    13         
    14         for (int columnIndex = 0; columnIndex < numberOfColumns; columnIndex++) {
    15             String labelText = labelProvider
    16                     .getColumnText(element, columnIndex);
    17             isMatch |= wordMatches(labelText);
    18         }
    19         
    20         return isMatch;
    21     }
    22     
    23 }
    代码如下:

    ChooseProjectEntryContentProvider、ChooseProjectEntryLabelProvider、ChooseProjectEntrySorter跟一般的TreeViewer差不多,

    这里再贴ChooseProjectEntryLabelProvider的部分代码:

     1 public class ChooseProjectEntryLabelProvider extends LabelProvider implements ITableLabelProvider{
     2 
     3     @Override
     4     public Image getColumnImage(Object element, int columnIndex) {
     5         return null;
     6     }
     7 
     8     @Override
     9     public String getColumnText(Object element, int columnIndex) {
    10         
    11         if(element instanceof FuncItem){
    12             FuncItem func = (FuncItem)element;
    13             switch(columnIndex){
    14             case 0:
    15                 return func.***;
    16             case 1:
    17                 return func.***;
    18             case 2:
    19                 return String.valueOf(func.***);
    20             default:
    21                 return "";    
    22             }
    23         }
    24         
    25         return getText(element);
    26     }
    27 
    28     
    29 }
    代码如下

    注意这里实现的是ITableLabelProvider接口。

    我自己用checkboxTreeViewer.setChecked(element, state)无法设置event.getElement()【checkStateChanged方法中】元素的状态,

    但是使用checkboxTreeViewer.setAllChecked(state)可以设置所有元素的状态为checked或者unchecked,

    没办法,我又需要使用FilteredTree,又无法使用setChecked办法设置指定元素状态(我单步调试进入setChecked方法里面看了看,应该是event.getElement()元素的问题),只好想出上面的馊办法,希望对读者有用。

  • 相关阅读:
    Django—使用后台管理Models
    Django—开发具体流程
    Sqlite—数据库管理与表管理
    Sqlite—数据类型
    Python—实现钉钉后台开发
    Xdebug文档(一)基本特性
    FHS定义的Linux目录树
    【转】给Windows + Apache 2.2 + PHP 5.3 安装PHP性能测试工具 xhprof
    【转】UTF-8汉字正则表达式
    【转】Nginx区分PC或手机访问不同网站
  • 原文地址:https://www.cnblogs.com/Shirlies/p/5067949.html
Copyright © 2011-2022 走看看