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

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

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

    Hexise's Blog

    業(yè)精于勤荒于嬉 行成于思?xì)в陔S
    posts - 13, comments - 12, trackbacks - 0, articles - 0
      BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

    JFace 可編輯的TreeViewer和TableViewer

    Posted on 2007-01-04 15:29 Hexise 閱讀(6393) 評(píng)論(4)  編輯  收藏 所屬分類: SWT/JFace

    向已有的TreeViewer和TableViewer上添加編輯功能,可以使用CellEditor和CellModifier。

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

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

    ????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ì)要編輯的模型信息一無(wú)所知。所以jface中引入了ICellModifier接口,將model與CellEditor聯(lián)系在一起。為了確定在CellModifier中的列,需要定義columnProperties的String[]數(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)前CellEditor的Value值,使用CellEditor.getValue()得到。另外,在執(zhí)行完更改后,需要刷新對(duì)應(yīng)的TableViewer或TreeViewer,使做出的更新可見(jiàn)。

    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());
    ????????????????????}

    ????????????????}

    ????????????}

    ????????}

    ????}


    }

    評(píng)論

    # re: JFace 可編輯的TreeViewer和TableViewer  回復(fù)  更多評(píng)論   

    2007-01-05 08:41 by lvcha
    感覺(jué)swt的設(shè)計(jì)比swing優(yōu)雅。

    # re: JFace 可編輯的TreeViewer和TableViewer  回復(fù)  更多評(píng)論   

    2007-11-14 21:44 by aPerSoN
    好文章呢。正在看這方面的東西

    # re: JFace 可編輯的TreeViewer和TableViewer  回復(fù)  更多評(píng)論   

    2013-07-23 20:46 by threedonnkey
    好像有一個(gè)錯(cuò)的地方:
    函數(shù)modify中Object oldValue = getValue(element, property);
    getValue中的element類型是對(duì)應(yīng)的Model,而modify中的element是Item類型
    改成:
    Object oldValue = getValue(((Item)element).getData(), property);

    # re: JFace 可編輯的TreeViewer和TableViewer  回復(fù)  更多評(píng)論   

    2013-11-01 14:05 by fengshao
    none

    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 亚洲国产精品综合久久2007| 在线免费观看一级毛片| 亚洲精品成人片在线观看精品字幕 | 亚洲AV无码一区二区一二区| 亚洲一区二区三区久久| 亚洲中文无韩国r级电影| 亚洲男人的天堂在线va拉文| 亚洲午夜国产片在线观看| 亚洲一级片内射网站在线观看| 亚洲精品在线免费看| 久久国产色AV免费观看| ASS亚洲熟妇毛茸茸PICS| 亚洲精品国产啊女成拍色拍| 麻豆国产人免费人成免费视频| 精品一卡2卡三卡4卡免费视频| 亚洲国产成人综合精品| 亚洲成人一区二区| 亚洲欧洲日本在线| 亚洲无线码在线一区观看| 四虎在线免费播放| 国产成人3p视频免费观看| 久热中文字幕在线精品免费| 免费在线观看一级毛片| 国产在线观看无码免费视频| a级毛片免费完整视频| 日本特黄特色AAA大片免费| 久久嫩草影院免费看夜色| 亚洲av无码专区青青草原| 免费人人潮人人爽一区二区| 久久久久国色AV免费观看| 午夜老司机永久免费看片| 黄网站色视频免费看无下截| 久久国产乱子伦精品免费午夜 | 四虎永久在线精品免费网址| 1000部无遮挡拍拍拍免费视频观看| 精品国产呦系列在线观看免费| 美女视频黄频a免费| 国产成人免费ā片在线观看老同学| 精品久久久久久无码免费| 亚洲精品国产免费| 国产成人高清精品免费鸭子 |