`
czjxdm
  • 浏览: 123718 次
社区版块
存档分类
最新评论

treeView refresh

阅读更多
当我们使用TableViewer或TreeViewer时,每当其input值发生改变,通常要调用视图的refresh方法来执行刷新操作,而使用EMF模型作为视图组件的文本提供器和标签提供器,却可以省略refresh操作。

当构建AdapterFactoryContentProvider和AdapterFactoryLabelProvider对象时,需要传入所需要的适配器工厂类,该适配器工厂类实现了IChangeNotifier接口定义的3个方法,起到了监听器的作用:
addListener(INotifyChangedListener notifyChangedListener):添加监听者
removeListener(INotifyChangedListener notifyChangedListener):删除监听者
fireNotifyChanged(Notification notification):对监听者执行通知操作

而同时AdapterFactoryContentProvider和AdapterFactoryLabelProvider对象都实现了INotifyChangedListener接口,因此在构造方法中,便可将自己注册成为适配器工厂类的监听者:

view plaincopy to clipboardprint?
01.public AdapterFactoryContentProvider(AdapterFactory adapterFactory){  
02.    this.adapterFactory = adapterFactory;  
03.    if (adapterFactory instanceof IChangeNotifier){  
04.      ((IChangeNotifier)adapterFactory).addListener(this);//将自己注册成为adapterFactory的监听者  
05.    }  
06.} 
public AdapterFactoryContentProvider(AdapterFactory adapterFactory){
    this.adapterFactory = adapterFactory;
    if (adapterFactory instanceof IChangeNotifier){
      ((IChangeNotifier)adapterFactory).addListener(this);//将自己注册成为adapterFactory的监听者
    }
}
这样,当适配器工厂类执行fireNotifyChanged方法时,便可将模型改变通知到AdapterFactoryContentProvider和AdapterFactoryLabelProvider对象,执行它们的notifyChanged()方法:

view plaincopy to clipboardprint?
01.public void notifyChanged(Notification notification){  
02.    if (viewer != null && viewer.getControl() != null && !viewer.getControl().isDisposed()){  
03.      if (notification instanceof IViewerNotification){  
04.        if (viewerRefresh == null){  
05.          viewerRefresh = new ViewerRefresh(viewer);  
06.        }  
07.        if (viewerRefresh.addNotification((IViewerNotification)notification)){  
08.          viewer.getControl().getDisplay().asyncExec(viewerRefresh);  
09.        }  
10.      }  
11.      else{  
12.        NotifyChangedToViewerRefresh.handleNotifyChanged(viewer,notification.getNotifier(),notification.getEventType(),  
13.  notification.getFeatur(),notification.getOldValue(),notification.getNewValue(),notification.getPosition());  
14.      }  
15.    }  
16.} 
public void notifyChanged(Notification notification){
    if (viewer != null && viewer.getControl() != null && !viewer.getControl().isDisposed()){
      if (notification instanceof IViewerNotification){
        if (viewerRefresh == null){
          viewerRefresh = new ViewerRefresh(viewer);
        }
        if (viewerRefresh.addNotification((IViewerNotification)notification)){
          viewer.getControl().getDisplay().asyncExec(viewerRefresh);
        }
      }
      else{
        NotifyChangedToViewerRefresh.handleNotifyChanged(viewer,notification.getNotifier(),notification.getEventType(),
  notification.getFeatur(),notification.getOldValue(),notification.getNewValue(),notification.getPosition());
      }
    }
}


由代码可以看出AdapterFactoryContentProvider和AdapterFactoryLabelProvider对象还记录了它们所对应的视图viewer,并在notifyChanged方法中对视图执行了刷新操作。

然而回到上一步,适配器工厂类的fireNotifyChanged方法又是在什么时候触发的呢?

当EMF实体类的类结构发生变化时(如:对某一个属性执行了set方法),会调用eNotify(Notification notification)方法来触发其适配器类的通知操作:

view plaincopy to clipboardprint?
01.public void eNotify(Notification notification){  
02.    Adapter[] eAdapters = eBasicAdapterArray();//返回该实体类所有的适配器类  
03.    if (eAdapters != null && eDeliver()){  
04.      for (int i = 0, size = eAdapters.length; i < size; ++i)  
05.      {  
06.        eAdapters[i].notifyChanged(notification);//执行适配器类的notifyChanged方法。  
07.      }  
08.    }  
09.} 
public void eNotify(Notification notification){
    Adapter[] eAdapters = eBasicAdapterArray();//返回该实体类所有的适配器类
    if (eAdapters != null && eDeliver()){
      for (int i = 0, size = eAdapters.length; i < size; ++i)
      {
        eAdapters[i].notifyChanged(notification);//执行适配器类的notifyChanged方法。
      }
    }
}


而EMF模型适配器类的构造函数中同样传入了adapterFactory适配器工厂类,这样在模型适配器类的notifyChanged方法中,便可进行如下处理:

view plaincopy to clipboardprint?
01.if (adapterFactory instanceof IChangeNotifier){  
02.      IChangeNotifier changeNotifier = (IChangeNotifier)adapterFactory;  
03.      changeNotifier.fireNotifyChanged(notification);  
04.} 
if (adapterFactory instanceof IChangeNotifier){
      IChangeNotifier changeNotifier = (IChangeNotifier)adapterFactory;
      changeNotifier.fireNotifyChanged(notification);
}


以此来触发适配器工厂类的fireNotifyChanged方法。
整个模型改变通知的类图大致如下:



1、当模型实体类Company的类结构发生变化时,会触发其适配器类(CompanyItemProvider)的notifyChange()方法;
2、模型适配器类会调用其适配器工厂类的fireNotifyChanged方法,来触发监听器的通知;
3、适配器工厂类对它的监听者(AdapterFactoryContentProvider)进行通知,执行他们的notifyChanged方法;
4、AdapterFactoryContentProvider对象中会执行视图的刷新操作。


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/JavaMan_chen/archive/2010/11/30/6045954.aspx


http://www.java2s.com/CN/Code/Java/SWT-JFace-Eclipse/Demonstratesmultilinecomments.htm



http://www.ibm.com/developerworks/cn/java/wa-eclipsemvc/


MVC 架构(或设计模式)是图形用户界面(GUI)的设计样式,由三部分构成:模型、视图和控制器。MVC 把表示层从数据解耦出来,也把表示从数据的操作解耦出来。
实现 MVC 架构与其他类型的应用程序有所不同。主要的区别来自如何放置和实现业务逻辑或查看呈现逻辑。与典型的 Web 应用程序不同,在这类程序中,程序员必须设计和实现所有 MVC 组件,而 Eclipse 提供的 API 可以替您做大部分控制或呈现工作。所以,不能严格地把 Eclipse 的 MVC 实现与 Web 或其他应用程序类型的 MVC 进行比较。
  • 大小: 26.5 KB
分享到:
评论

相关推荐

    vb_Treeview节点上下左右移动.rar_VB树节点功能_adventurehpj_vb treeview_vb tree

    3. **刷新视图**:最后,调用`Redraw`或`Refresh`方法更新Treeview控件的显示,确保用户可以看到节点位置的变化。 压缩包中的文件列表包括: - `Mod_GUID.bas`:这是一个标准模块,可能包含了通用的函数和过程,...

    treeview 局部刷新问题

    对于treeview,可能需要调用特定的函数,如`refresh()`或`reloadNode()`来更新节点。 4. **保持状态**:确保在更新过程中,treeview的展开/折叠状态、选中状态和其他用户交互状态得以保留。 5. **触发事件**:更新...

    WPF TreeView拖拽实例

    treeView.Items.Refresh(); } ``` 4. **创建可拖动的树节点**:为了让`TreeViewItem`可以被拖动,你需要在`HierarchicalDataTemplate`中添加必要的数据模板。通常,`Mouse右键Click`事件用于启动拖动操作,而`...

    C#TreeView右键菜单操作在编辑树节点

    treeView1.Refresh(); } } } ``` **增加新节点:** 在“新增”菜单项的点击事件处理函数中,需要确定新节点的位置(父节点),然后创建并添加新的`TreeNode`。 ```csharp private void AddNode(object sender, ...

    c# 如何实现鼠标拖动TreeView节点

    treeView1.Refresh(); } } ``` 以上代码实现了一个基本的拖放功能,允许用户在`TreeView`中拖动节点并改变其位置。需要注意的是,这只是一个基础示例,实际项目中可能需要根据具体需求进行调整,例如添加错误处理...

    TreeView实现无限级分类

    tvCategories.Refresh(); // 刷新TreeView显示 } ``` 这里只是简单展示了如何在BeforeExpand事件中动态加载子节点,以及在按钮点击事件中添加新分类。 5. 性能优化: - 分页加载:如果分类数量巨大,考虑分页...

    bootstrap-treeview动态加载后台数据菜单

    这里,我们检查了节点是否已经加载了子节点,如果没有,就向后台请求子节点数据,并在收到数据后更新节点的`nodes`属性,然后调用`treeview('refresh')`方法刷新视图,传入当前节点和`true`参数以指示应递归刷新所有...

    C#小程序treeview imagelist listview 应用

    6. **刷新显示**:最后,确保调用`ListView.Refresh()`或`Control.Invalidate()`来立即更新UI,显示新选择的项和图标。 总的来说,`TreeView`、`ImageList`和`ListView`的结合使用提供了丰富的用户界面功能,允许...

    treeview是主要用来建立进化树的

    TreeView 控件响应一些我们觉的VFP 控件的方法和事件: Click, DblClick, Drag, DragDrop, DragOver, GotFocus, KeyDown, KeyPress, KeyUp, LostFocus, MouseDown, MouseMove, MouseUp, Move, Refresh, SetFocus, ...

    TreeView创建并点击父节点无刷新事件

    通常,当我们添加或删除节点时,控件会自动刷新显示,但我们可以通过控制是否调用`TreeView.Refresh()`或`Update()`方法来阻止这种行为。 ```csharp private void treeView1_NodeMouseClick(object sender, ...

    AndroidTreeView

    5. 更新数据:如果数据源发生变化,可以通过`refresh()`方法刷新视图。 总之,AndroidTreeView是Android开发者处理层级数据展示的强大工具,它简化了树形视图的实现过程,同时提供了丰富的定制选项,使得应用界面更...

    jsontree (jquery.treeview.js) jQuery插件版

    $("#yourList").treeview("refresh"); ``` ### 8. **优化与性能** 对于大量数据,可以考虑分页加载或延迟加载(懒加载)技术,避免一次性加载所有数据导致的性能问题。`jQuery Treeview`可能需要与其他库(如`ajax...

    Delphi中快速实现数据库树形结构并实现Treeview导航表数据.rar

    6. **数据更新**:当数据库中的数据发生变化时,可以通过重新执行查询或者使用数据集组件的Refresh方法来更新Treeview。同时,可能需要监听数据集的OnDataChange事件,以便在数据改变时动态更新Treeview。 7. **...

    WPF Treeview排序

    view.Refresh(); ``` 请注意,上述代码仅作为示例,实际应用中需要根据具体的数据源类型和排序需求进行调整。 在WPF TreeView的排序中,理解数据绑定、ICollectionView接口和事件驱动编程至关重要。通过这些技术,...

    JavaScript树\利用JavaScript实现树型结构的TreeView类

    ### JavaScript树:利用JavaScript实现树型结构的TreeView类 在现代Web开发中,树形结构是一种常见的数据组织方式,尤其适用于表示具有层级关系的数据集合,如文件系统、组织架构图等。利用JavaScript来构建这样的...

    delphi中TreeView的一些应用

    如果修改了节点的属性或数据,可能需要调用`Refresh`方法来确保`TreeView`控件立即反映这些变化。 ### 使用`BeginUpdate`和`EndUpdate` 为了提高处理大量节点时的性能,建议在添加或删除大量节点前调用`Begin...

    rcp treeview的相关资料

    通过调用`TreeViewer.refresh`或`TreeViewer.update`方法,可以确保视图与数据模型保持同步。 9. **性能优化** 对于大数据量的树结构,需要考虑性能优化。例如,可以使用虚拟化技术只加载可见的节点,或者延迟加载...

    树节点上下移动.zip

    4. **刷新视图**:完成节点位置的调整后,需要调用`TreeView`控件的`Refresh`方法,以更新控件的显示。 5. **处理特殊情况**:在实际应用中,可能需要考虑一些特殊情况,比如节点是否有子节点,移动节点时如何保持...

    基于c#、jquery开发的treeView目录树组件

    很简洁,可随意定制-Based on c#, jquery development treeView tree components, the biggest feature is the display of the tree node state to ajax way, saved to a user session, even if a page refresh, the...

    SWT中利用Treeview来显示XML文件

    6. **刷新视图**:当XML数据改变或需要更新显示时,调用`Tree.refresh()`方法可以更新Treeview的内容。 7. **优化性能**:为了提高性能,可以使用`Tree.setRedraw(false)`和`Tree.setRedraw(true)`来控制Treeview的...

Global site tag (gtag.js) - Google Analytics