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

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

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

    hengheng123456789

      BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
      297 Posts :: 68 Stories :: 144 Comments :: 0 Trackbacks
     

    通過TreeColumn實現表格樹”TableTree

    Eclipse 3.1deprecateTableTree這個控件,與之對應的jfaceTableTreeViewer雖然沒有deprecate,但使用它會得到很多警告。在TableTreeViewer的第一列里是不能顯示圖標的,因為這個位置被+/-符號占用了,而且TableTree是顯示不出 Tree的層次的,也就是沒有縮進。

    SWT 3.1里的Tree控件新支持了列的顯示,是通過TreeColumn來實現的。在jface里則沒有添加新的viewer,使用原先的TreeViewer即可支持,下面是一段例子代碼,注意如果在windows里運行要修改一下setInput()這條語句的參數,例如改為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) {
                
            }
            
        }
    }

    這是運行畫面:

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

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

    通常使用的CellEditor的子類就是:CheckboxCellEditorComboBoxCellEditorTextCellEditor
    CellEditor
    一般用數組來保存,如果某個列不需要編輯,則可將該列的CellEditor設為null
    CellEditor的數組定義完后,即可利用setCellEditors(CellEditor[] editors)方法將該數組設置到對應的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,避免了設置value時造成的空指針異常。

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


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

    ICellModifier定義了三個接口方法:

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

    public Object getValue(Object element, String property);
    該方法一般在activateCellEditor()時調用,用于設定CellEditor的初始值。其中element是對應的model

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

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

    org.eclipse.debug.internal.ui.elements.adapters.DefaultVariableCellModifier
    ICellModifier的一個完整實現:

    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 哼哼 閱讀(2528) 評論(0)  編輯  收藏 所屬分類: JAVA-Eclipse
    主站蜘蛛池模板: 免费一级毛片在线播放视频免费观看永久 | 亚洲人成网站999久久久综合| 亚洲色大情网站www| 国产成人无码精品久久久久免费| 午夜影院免费观看| 免费永久国产在线视频| 久久精品国产精品亚洲毛片| 精品亚洲成A人在线观看青青| 日本免费中文视频| www.91亚洲| 亚洲av成人中文无码专区| 3344永久在线观看视频免费首页 | 久久国产免费福利永久| 亚洲一区精品无码| 美女被爆羞羞网站在免费观看| **aaaaa毛片免费| 自拍偷区亚洲国内自拍| 3344永久在线观看视频免费首页| 亚洲成人福利网站| 无码人妻丰满熟妇区免费| 亚洲国产精品国自产拍电影| 午夜亚洲国产精品福利| 成人五级毛片免费播放| 亚洲av永久无码精品天堂久久| 特级无码毛片免费视频尤物| 亚洲国产精品白丝在线观看| 国产美女精品视频免费观看 | 亚洲无限乱码一二三四区| 成人免费一区二区无码视频| 亚洲综合激情视频| 男人j进入女人j内部免费网站| 亚洲综合无码一区二区三区| 成人网站免费观看| j8又粗又长又硬又爽免费视频| 亚洲高清在线观看| 无码人妻久久一区二区三区免费| 亚洲五月综合缴情婷婷| 成人性生交视频免费观看| 亚洲性色精品一区二区在线| 国产综合精品久久亚洲| 999zyz**站免费毛片|