当我们使用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
分享到:
相关推荐
treeView.Items.Refresh(); } ``` 4. **创建可拖动的树节点**:为了让`TreeViewItem`可以被拖动,你需要在`HierarchicalDataTemplate`中添加必要的数据模板。通常,`Mouse右键Click`事件用于启动拖动操作,而`...
3. **刷新视图**:最后,调用`Redraw`或`Refresh`方法更新Treeview控件的显示,确保用户可以看到节点位置的变化。 压缩包中的文件列表包括: - `Mod_GUID.bas`:这是一个标准模块,可能包含了通用的函数和过程,...
对于treeview,可能需要调用特定的函数,如`refresh()`或`reloadNode()`来更新节点。 4. **保持状态**:确保在更新过程中,treeview的展开/折叠状态、选中状态和其他用户交互状态得以保留。 5. **触发事件**:更新...
treeView1.Refresh(); } } } ``` **增加新节点:** 在“新增”菜单项的点击事件处理函数中,需要确定新节点的位置(父节点),然后创建并添加新的`TreeNode`。 ```csharp private void AddNode(object sender, ...
treeView1.Refresh(); } } ``` 以上代码实现了一个基本的拖放功能,允许用户在`TreeView`中拖动节点并改变其位置。需要注意的是,这只是一个基础示例,实际项目中可能需要根据具体需求进行调整,例如添加错误处理...
tvCategories.Refresh(); // 刷新TreeView显示 } ``` 这里只是简单展示了如何在BeforeExpand事件中动态加载子节点,以及在按钮点击事件中添加新分类。 5. 性能优化: - 分页加载:如果分类数量巨大,考虑分页...
这里,我们检查了节点是否已经加载了子节点,如果没有,就向后台请求子节点数据,并在收到数据后更新节点的`nodes`属性,然后调用`treeview('refresh')`方法刷新视图,传入当前节点和`true`参数以指示应递归刷新所有...
6. **刷新显示**:最后,确保调用`ListView.Refresh()`或`Control.Invalidate()`来立即更新UI,显示新选择的项和图标。 总的来说,`TreeView`、`ImageList`和`ListView`的结合使用提供了丰富的用户界面功能,允许...
TreeView 控件响应一些我们觉的VFP 控件的方法和事件: Click, DblClick, Drag, DragDrop, DragOver, GotFocus, KeyDown, KeyPress, KeyUp, LostFocus, MouseDown, MouseMove, MouseUp, Move, Refresh, SetFocus, ...
6. **数据更新**:当数据库中的数据发生变化时,可以通过重新执行查询或者使用数据集组件的Refresh方法来更新Treeview。同时,可能需要监听数据集的OnDataChange事件,以便在数据改变时动态更新Treeview。 7. **...
通常,当我们添加或删除节点时,控件会自动刷新显示,但我们可以通过控制是否调用`TreeView.Refresh()`或`Update()`方法来阻止这种行为。 ```csharp private void treeView1_NodeMouseClick(object sender, ...
5. 更新数据:如果数据源发生变化,可以通过`refresh()`方法刷新视图。 总之,AndroidTreeView是Android开发者处理层级数据展示的强大工具,它简化了树形视图的实现过程,同时提供了丰富的定制选项,使得应用界面更...
$("#yourList").treeview("refresh"); ``` ### 8. **优化与性能** 对于大量数据,可以考虑分页加载或延迟加载(懒加载)技术,避免一次性加载所有数据导致的性能问题。`jQuery Treeview`可能需要与其他库(如`ajax...
view.Refresh(); ``` 请注意,上述代码仅作为示例,实际应用中需要根据具体的数据源类型和排序需求进行调整。 在WPF TreeView的排序中,理解数据绑定、ICollectionView接口和事件驱动编程至关重要。通过这些技术,...
### JavaScript树:利用JavaScript实现树型结构的TreeView类 在现代Web开发中,树形结构是一种常见的数据组织方式,尤其适用于表示具有层级关系的数据集合,如文件系统、组织架构图等。利用JavaScript来构建这样的...
如果修改了节点的属性或数据,可能需要调用`Refresh`方法来确保`TreeView`控件立即反映这些变化。 ### 使用`BeginUpdate`和`EndUpdate` 为了提高处理大量节点时的性能,建议在添加或删除大量节点前调用`Begin...
通过调用`TreeViewer.refresh`或`TreeViewer.update`方法,可以确保视图与数据模型保持同步。 9. **性能优化** 对于大数据量的树结构,需要考虑性能优化。例如,可以使用虚拟化技术只加载可见的节点,或者延迟加载...
4. **刷新视图**:完成节点位置的调整后,需要调用`TreeView`控件的`Refresh`方法,以更新控件的显示。 5. **处理特殊情况**:在实际应用中,可能需要考虑一些特殊情况,比如节点是否有子节点,移动节点时如何保持...
很简洁,可随意定制-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...
6. **刷新视图**:当XML数据改变或需要更新显示时,调用`Tree.refresh()`方法可以更新Treeview的内容。 7. **优化性能**:为了提高性能,可以使用`Tree.setRedraw(false)`和`Tree.setRedraw(true)`来控制Treeview的...