<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    hengheng123456789

      BlogJava :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
      297 Posts :: 68 Stories :: 144 Comments :: 0 Trackbacks
     

    通過TreeColumn實(shí)現(xiàn)表格樹”TableTree

    Eclipse 3.1deprecateTableTree這個(gè)控件,與之對(duì)應(yīng)的jfaceTableTreeViewer雖然沒有deprecate,但使用它會(huì)得到很多警告。在TableTreeViewer的第一列里是不能顯示圖標(biāo)的,因?yàn)檫@個(gè)位置被+/-符號(hào)占用了,而且TableTree是顯示不出 Tree的層次的,也就是沒有縮進(jìn)。

    SWT 3.1里的Tree控件新支持了列的顯示,是通過TreeColumn來實(shí)現(xiàn)的。在jface里則沒有添加新的viewer,使用原先的TreeViewer即可支持,下面是一段例子代碼,注意如果在windows里運(yùn)行要修改一下setInput()這條語(yǔ)句的參數(shù),例如改為setInput(new File("c:"""))

    import java.io.File;

    import org.eclipse.jface.viewers.ILabelProviderListener;
    import org.eclipse.jface.viewers.ITableLabelProvider;
    import org.eclipse.jface.viewers.ITreeContentProvider;
    import org.eclipse.jface.viewers.TreeViewer;
    import org.eclipse.jface.viewers.Viewer;
    import org.eclipse.swt.SWT;
    import org.eclipse.swt.graphics.Image;
    import org.eclipse.swt.layout.FillLayout;
    import org.eclipse.swt.widgets.Display;
    import org.eclipse.swt.widgets.Shell;
    import org.eclipse.swt.widgets.TreeColumn;


    public class TreeColumnTest {
        
        
    public void run(){
            
    final Display display = new Display();
            
    final Shell shell = new Shell(display);
            shell.setLayout(
    new FillLayout());
            
            
    final TreeViewer viewer = new TreeViewer(shell, SWT.FULL_SELECTION);
            viewer.getTree().setHeaderVisible(
    true);
            TreeColumn column = 
    new TreeColumn(viewer.getTree(), SWT.LEFT);
            column.setText("Name");
            column.setWidth(200);
            column = 
    new TreeColumn(viewer.getTree(), SWT.LEFT);
            column.setText("Size");
            column.setWidth(100);
            column = 
    new TreeColumn(viewer.getTree(), SWT.LEFT);
            column.setText("Hidden");
            column.setWidth(100);
            viewer.setContentProvider(
    new MyTreeContenetProvider());
            viewer.setLabelProvider(
    new MyTableLableProvider());
            viewer.setInput(
    new File("/"));

            shell.open();
            
    while (!shell.isDisposed()) {
                
    if (!display.readAndDispatch())
                    display.sleep();
            }
            display.dispose();
        }

        
    public static void main(String[] args) {
            
    new TreeColumnTest().run();
        }
        
        
    class MyTreeContenetProvider implements ITreeContentProvider{

            
    public Object[] getChildren(Object parentElement) {
                File file=(File)parentElement;
                
    if(file.isDirectory())
                    
    return file.listFiles();
                
    else
                    
    return null;
            }

            
    public Object getParent(Object element) {
                File file=(File)element;
                
    return file.getParentFile();
            }

            
    public boolean hasChildren(Object element) {
                File file=(File)element;
                
    return file.isDirectory()/*&&file.list().length>0*/;
            }

            
    public Object[] getElements(Object inputElement) {
                File file=(File)inputElement;
                
    return file.isDirectory()?file.listFiles():new Object[]{file};
            }

            
    public void dispose() {
                
            }

            
    public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
                
            }
            
        }
        
        
    class MyTableLableProvider implements ITableLabelProvider{

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

            
    public String getColumnText(Object element, int columnIndex) {
                File file=(File)element;
                
    switch (columnIndex) {
                
    case 0:
                    
    return file.getName();
                
    case 1:
                    
    return ""+file.length();
                
    case 2:
                    
    return ""+file.isHidden();
                
    default:
                    
    return "";
                }
            }

            
    public void addListener(ILabelProviderListener listener) {
                
            }

            
    public void dispose() {
                
            }

            
    public boolean isLabelProperty(Object element, String property) {
                
    return false;
            }

            
    public void removeListener(ILabelProviderListener listener) {
                
            }
            
        }
    }

    這是運(yùn)行畫面:

    向已有的TreeViewerTableViewer上添加編輯功能,可以使用CellEditorCellModifier

    CellEditor定義了某個(gè)列被編輯時(shí)顯示的外觀,它可以是文本框、下拉列表框或單選框,也可以自己定義。

    通常使用的CellEditor的子類就是:CheckboxCellEditorComboBoxCellEditorTextCellEditor
    CellEditor
    一般用數(shù)組來保存,如果某個(gè)列不需要編輯,則可將該列的CellEditor設(shè)為null
    當(dāng)CellEditor的數(shù)組定義完后,即可利用setCellEditors(CellEditor[] editors)方法將該數(shù)組設(shè)置到對(duì)應(yīng)的TreeViewerTableViewer中去。例如:

        CellEditor[] cellEditors  =   new  CellEditor[ 5 ];
        cellEditors[
    0 =   new  TextCellEditor(tableViewer.getTable());
        cellEditors[
    1 =   null ;
        cellEditors[
    2 =   new  ComboBoxCellEditor(tableViewer.getTable(),  new  String[]{ " first " " second " " third " " forth " });
        cellEditors[
    3 =   new  CheckboxCellEditor(tableViewer.getTable());
        cellEditors[
    4 =   new  CustomizedTextCellEditor(tableViewer.getTable());
        tableViewer.setCellEditors(cellEditors);


    其中CustomizedTextCellEditor是自定義的CellEditor,避免了設(shè)置value時(shí)造成的空指針異常。

    protected class CustomizedTextCellEditor extends TextCellEditor{
        
    public CustomizedTextCellEditor(Composite parent){
            
    super(parent);
        }
        
    protected void doSetValue(Object value) {
            
    if(value == null)
                
    return;
            
    super.doSetValue(value);
        }        
    }


    CellEditor
    負(fù)責(zé)外觀,它對(duì)要編輯的模型信息一無所知。所以jface中引入了ICellModifier接口,將modelCellEditor聯(lián)系在一起。為了確定在CellModifier中的列,需要定義columnPropertiesString[]數(shù)組,用以區(qū)分不同列對(duì)應(yīng)的不同屬性。使用setColumnProperties(String[] columnProperties)設(shè)置該屬性集。

    ICellModifier定義了三個(gè)接口方法:

    public boolean canModify(Object element, String property);
    該方法判斷何時(shí)該列可以被編輯。其中element是對(duì)應(yīng)的model。返回true表示此時(shí)該列可以被編輯。

    public Object getValue(Object element, String property);
    該方法一般在activateCellEditor()時(shí)調(diào)用,用于設(shè)定CellEditor的初始值。其中element是對(duì)應(yīng)的model

    此處雖然可以返回Object類型的引用,但是使用時(shí)需小心,特定的CellEditor僅接受特定類型的Value。比如:
    TextCellEditor
    對(duì)應(yīng)String類型的Value
    ComboBoxCellEditor
    對(duì)應(yīng)Integer類型的Value
    CheckBoxCellEditor
    對(duì)應(yīng)Boolean類型的Value
    若返回了不適合的Value對(duì)象,則會(huì)拋出AssertionFailedException

    public void modify(Object element, String property, Object value);
    該方法執(zhí)行保存修改。一般在saveEditorValue之類的方法中調(diào)用。此處的element不再是model,而是Item類型的引用。取用對(duì)應(yīng)的模型,需要使用((Item) element).getData()方法。一般此處的value值,也就是當(dāng)前CellEditorValue值,使用CellEditor.getValue()得到。另外,在執(zhí)行完更改后,需要刷新對(duì)應(yīng)的TableViewerTreeViewer,使做出的更新可見。

    org.eclipse.debug.internal.ui.elements.adapters.DefaultVariableCellModifier
    ICellModifier的一個(gè)完整實(shí)現(xiàn):

    import org.eclipse.debug.core.DebugException;
    import org.eclipse.debug.core.model.IVariable;
    import org.eclipse.debug.internal.ui.DebugUIPlugin;
    import org.eclipse.debug.internal.ui.DefaultLabelProvider;
    import org.eclipse.debug.internal.ui.VariableValueEditorManager;
    import org.eclipse.debug.ui.actions.IVariableValueEditor;
    import org.eclipse.jface.viewers.ICellModifier;

    /**
     * 
    @since 3.2
     *
     */

    public class DefaultVariableCellModifier implements ICellModifier {
        
        
    /* (non-Javadoc)
         * @see org.eclipse.jface.viewers.ICellModifier#canModify(java.lang.Object, java.lang.String)
         */

        
    public boolean canModify(Object element, String property) {
            
    if (VariableColumnPresentation.COLUMN_VARIABLE_VALUE.equals(property)) {
                
    if (element instanceof IVariable) {
                    
    return ((IVariable) element).supportsValueModification();
                }
            }
            
    return false;
        }

        
    /* (non-Javadoc)
         * @see org.eclipse.jface.viewers.ICellModifier#getValue(java.lang.Object, java.lang.String)
         */

        
    public Object getValue(Object element, String property) {
            
    if (VariableColumnPresentation.COLUMN_VARIABLE_VALUE.equals(property)) {
                
    if (element instanceof IVariable) {
                    IVariable variable = (IVariable) element;
                    
    try {
                        
    return DefaultLabelProvider.escapeSpecialChars(variable.getValue().getValueString());
                    } 
    catch (DebugException e) {
                        DebugUIPlugin.log(e);
                    }
                }
            }
            
    return null;
        }

        
    /* (non-Javadoc)
         * @see org.eclipse.jface.viewers.ICellModifier#modify(java.lang.Object, java.lang.String, java.lang.Object)
         */

        
    public void modify(Object element, String property, Object value) {
            Object oldValue = getValue(element, property);
            
    if (!value.equals(oldValue)) {
                
    if (VariableColumnPresentation.COLUMN_VARIABLE_VALUE.equals(property)) {
                    
    if (element instanceof IVariable) {
                        IVariable variable = (IVariable) element;
                        IVariableValueEditor editor = VariableValueEditorManager.getDefault().getVariableValueEditor(variable.getModelIdentifier());
                        
    if (value instanceof String) {
                            value = DefaultLabelProvider.encodeEsacpedChars((String)value);
                        }
                        
    if (editor != null{
                            
    if  (editor.saveVariable(variable, (String) value, DebugUIPlugin.getShell())) {
                                
    return;
                            }
                        }
                        
    try {
                            variable.setValue((String) value);
                        } 
    catch (DebugException e) {
                            DebugUIPlugin.errorDialog(DebugUIPlugin.getShell(), Messages.VariableColumnPresentation_4, Messages.VariableColumnPresentation_5, e.getStatus());
                        }
                    }
                }
            }
        }

    }

    posted on 2007-09-03 15:42 哼哼 閱讀(2534) 評(píng)論(0)  編輯  收藏 所屬分類: JAVA-Eclipse
    主站蜘蛛池模板: 午夜视频在线观看免费完整版| 免费高清在线影片一区| 免费无码一区二区三区| 精品免费久久久久久成人影院| 亚洲国产午夜精品理论片 | 日韩精品一区二区亚洲AV观看| 亚洲熟妇无码八V在线播放| 少妇性饥渴无码A区免费| 在线观看免费精品国产| 中文字幕亚洲精品| 在线免费视频你懂的| 在线成人a毛片免费播放| 一本色道久久88亚洲精品综合| 成人免费无码大片A毛片抽搐| 国产AV无码专区亚洲AV毛网站| 337P日本欧洲亚洲大胆艺术图| 99久久99久久精品免费观看 | 亚洲成av人在片观看| 亚洲美女人黄网成人女| 91精品免费久久久久久久久| 国产亚洲精品成人AA片新蒲金| 亚洲国产aⅴ成人精品无吗| 麻豆一区二区免费播放网站| 亚洲国产精品VA在线看黑人| 69免费视频大片| 亚洲AV无码一区二区三区DV| 国产福利免费视频 | 中文字幕成人免费视频| 亚洲色偷拍区另类无码专区| 亚洲av成人一区二区三区观看在线| 久草免费在线观看视频| 亚洲网址在线观看你懂的| 免费国产成人18在线观看| 亚洲精品V欧洲精品V日韩精品| 一级大黄美女免费播放| 亚洲不卡AV影片在线播放| 久久一区二区三区免费播放| 亚洲av成人无码久久精品| 日本人成在线视频免费播放| 亚洲AV无码一区二区三区DV | 久久亚洲中文字幕精品一区|