【问题标题】:Where to keep data (model) for a view in Eclipse RCP?Eclipse RCP 中视图的数据(模型)保存在哪里?
【发布时间】:2014-01-05 22:50:21
【问题描述】:

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

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

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

更新

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

这不会删除问题。

我会写这个案例:

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

更新 2

换句话说:在 Eclipse 平台中是否有任何方便的位置来保存应用程序或会话范围的数据?

更新 3

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

换句话说:RCP view 是否违反模型-view-控制器模式?

更新 4

我们换个说法:createPartControl()方法可以访问哪些区域?

1) 参数Composite parent

2) 任何类的任何静态方法

3) 别的什么?

它可以访问应用程序实例吗?或工作台实例?可能是应用程序上下文?或其他一些我可以放置它需要绘制的数据的实例?

【问题讨论】:

    标签: java eclipse swt eclipse-rcp


    【解决方案1】:

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

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

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

    希望这会有所帮助。

    【讨论】:

      【解决方案2】:

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

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

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

      可序列化的包装器、进入数据库的 POJO 等

      你的问题有点模糊,如果你不明白我的回答,你必须更具体。


      编辑 1:

      没有。 Eclipse RCP 不处理数据源。它具有轻量级机制,可以处理preferences 之类的事情。对于你自己的数据,你必须序列化你的东西。

      【讨论】:

      • 我不明白,你为什么说序列化?我的问题是在内存中将反序列化对象保存在哪里。
      • @SuzanCioc ...您只需将它们保存在内存中即可。您实例化模型对象并使用它。
      • 所以,我不应该使用 MVC 模式,应该将视图与模型混合,对吗? Eclipse 平台不倾向于我使用 MVC 对吗?
      • @SuzanCioc 也许this 会有所帮助。
      【解决方案3】:

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

      当开始一个新的 Eclipse RCP 项目时,您构建了许多操作单个模型的视图。您想知道应该如何存储实际模型。这是因为 Eclipse 使用“工作区”范例,它是在您启动框架时打开的单个目录。其他一切都来自这个工作台:项目、编辑的文件等等。

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

      我遵循以下路径/推理:

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

      【讨论】:

        猜你喜欢
        • 2010-09-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-10
        • 1970-01-01
        • 1970-01-01
        • 2013-10-19
        • 1970-01-01
        相关资源
        最近更新 更多