java - 在哪里保存 Eclipse RCP 中 View 的数据(模型)?

标签 java eclipse swt eclipse-rcp

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

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

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

更新

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

这不会删除问题。

我会写这个案例:

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

更新 2

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

更新 3

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

换句话说:RCP view 是否违反了模型- View - Controller 模式?

更新 4

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

1) 是参数Composite parent

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

3) 还有什么?

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

最佳答案

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

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

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

希望这能有所帮助。

关于java - 在哪里保存 Eclipse RCP 中 View 的数据(模型)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20940252/

相关文章:

java - jelly.config 中的可选 block 不会转换到 jenkins 插件开发中的后端。

Java EE 电子商务框架

java - 遍历几个 jar

eclipse - 如何向 eclipse 添加插件,以便我可以从 Eclipse 运行 QML

eclipse - 在 Eclipse 中切换测试和类的键盘快捷键?

java - 将字体高度设置为 float ,而不是整数

java - 在 eclipse 中使用 TableColumnLayout 时出现 AssertionFailedException

java - 使用 maven 不断收到 java.lang.NoClassDefFoundError

Java class.getResource().getPath() 在 URL 的开头添加了一个奇怪的 '/'

java - Hibernate @CollectionId 有错误 : HHH000346: Error during managed flush