在Eclipse RCP中保存视图的数据(模型)的位置?

时间:2014-01-05 22:50:21

标签: java eclipse swt eclipse-rcp

我有一个第三方类(假设它是一个类似树的容器)。

如何正确实现视图?我在ViewPart类中看不到类似MVC的方法。例如,没有像Swing那样的setModel()方法。

在Hello World视图示例中,他们只是将一些硬编码文本设置为标签。我应该在实际的例子中将数据保存在哪里?

更新

假设我有一个带setModel()方法的好MVC小部件,名为MyGreatWidget()

这不会删除问题。

我会写这个案子:

public void createPartControl(Composite parent) {
     widget = new MyGreatWidget(parent);
     widget.setModel(... // where to get data?
  }

更新2

换句话说:Eclipse平台中有没有方便的地方保存应用程序或会话范围的数据?

更新3

我的问题是在哪里保存已经在内存中的反序列化对象。

换句话说:RCP 查看违反模型 - 查看 - 控制器模式?

更新4

让我们重新解释一下这个问题:createPartControl()方法可以访问哪些区域?

1)它是参数Composite parent

2)任何类的静态方法

3)别的东西?

可以访问应用程序实例吗?或工作台实例?可能是申请背景?或者我可以把它需要绘制的数据放到其他一些实例中?

3 个答案:

答案 0 :(得分:3)

我对您的问题的理解如下:

  • 某种用户的交互会导致您的视图/编辑器显示。
  • Eclipse框架开始创建内容(例如,您指定的createPartControl()方法)。此时,您应该初始化所有精彩的小部件和必要的控件(在UI部分中使它们可用)。您可以将它们设置为View类的私有实例,也可以构建自己的框架来跟踪控件,例如在某些Map中。此外,在此步骤中为查看者设置内容提供程序。
  • 创建UI时,您可以开始使用数据填充小部件(从文件中读取数据,向服务器发出请求等)。它可以在后台作业中执行,以获得更具响应性的UI。请注意,数据加载机制(以及通知UI已加载数据的机制)因应用而异,因此您必须为此创建自己的轮。 这是您创建模型的步骤。这取决于您,保留它的位置(通常只需将其作为视图中的实例 )。此外,请记住,您不需要立即加载组合框的数据,因为您可以坚持使用延迟加载解决方案(使用ComboViewer和ContentProvider)。
  • 加载数据后,您可以通过调用相关方法(例如,setText()用于标签窗口小部件等)来填充窗口小部件。
  • 就个人而言,我喜欢使用JFace data binding mechanism用数据填充小部件并使模型保持最新,而不必每次都编写代码从小部件中获取数据并将其写回模型,然后再保存模型。

编辑:顺便说一句,我认为没有必要为胖客户端应用程序引入控制器层,因为不需要控制UI的创建,因为正确的视图的创建是由您的代码严格定义的,这已经是介绍了客户的机器。无需要求服务器返回视图(与Web应用程序不同),您只需要它返回一些数据(模型)。

希望这会有所帮助。

答案 1 :(得分:2)

  

如何正确实现视图?我在ViewPart类中看不到类似MVC的方法。例如,没有像Swing那样的setModel()方法。

你必须自己做。此外,您不要在视图本身上设置模型,而是在与您自己的框架连接的小部件上设置模型。

  

在Hello World视图示例中,他们只是将一些硬编码文本设置为标签。我应该在实际的例子中将数据保存在哪里?

Serializable包装器,进入数据库的POJO等。

你的问题有点模糊,如果你不理解我的答案,你必须更加具体。

<小时/> 编辑1:

没有。 Eclipse RCP不处理数据源。它具有处理preferences之类的轻量级机制。对于您自己的数据,您必须序列化您的内容。

答案 2 :(得分:0)

我想我理解你的实际问题。我在同样的问题上挣扎。

在启动新的Eclipse RCP项目时,您构建了许多操作单个模型的视图。您想知道如何存储实际模型。这是因为Eclipse使用'workspace'范例,它是启动框架时打开的单个目录。其他所有东西都从这个工作台中出现:项目,编辑的文件等等。

当您构建自己的应用程序时,您将很难找到一个好的替代方案。通常,应用程序是基于文件的,具有“打开”,“新文件”,“另存为”或“关闭”等范例。多个视图操纵这个单个“文件”。

我按照下面的路径/推理:

  • 拥有始终存在的“根”或“主”视图。此视图初始化并包含您的模型。打开或关闭文件时,可以在“主”视图中更改引用。
  • 这并不适用于所有情况。因此,我使用了WorkbenchPage的“输入”字段。这具有允许多个窗口的额外好处。单个页面(和单个输入)对应于单个窗口。但是,您只能从UI线程中找到您的模型,这将为您提供异步作业中的问题,例如。
  • 最后,我决定使用EditingDomain框架。您可以根据它的ID恢复EditingDomain。我在这个EditingDomain中加载我的模型,因此可以从任何上下文轻松访问它,即使GUI线程不再可用(例如异步作业)。