JavaFX 中的 MVVM。具有数据模型的控件

2024-01-06

我在fxml文件中定义了一个TableView,但我无法指定表的列,因为表将具有一些数据模型知识,这会违反MVVM。我创建了一个类,它提供 TableColumn 的集合并提供数据模型。我想更改相对于表中所选项目的按钮状态。如何在不违反MVVM规则的情况下做到这一点?


为了解释如何使用 MVVM 创建表,我使用“联系人”表作为示例。这Contact类可能如下所示:

class Contact {
    private String firstName;
    private String lastName;
    // Getter/Setters
}

The Contact类是一个实体,属于模型。 MVVM 规则规定它不应该被 View/CodeBehind 可见或使用。 相反,我会创建一个新类ContactTableRow包裹着一个Contact:

class ContactTableRow {
    private Contact contact;
    ContactTableRow(Contact contact) {
    public String getFirstName() {
        return contact.getFirstName();
    }
    // getter for Lastname
}

从概念上讲,此类属于 ViewModel 层。对于 ViewModel 来说,访问和使用模型类是合法的。

在您的 View 类/CodeBehind 中,您现在可以将这个新类用于 TableView:

class ContactsView {
    @FXML
    private TableView<ContactTableRow> table;

}

这也满足 MVVM 的规则,因为 View 可以使用 ViewModel 类。在您实际的 ViewModel 中,您现在可以创建一个ObservableList<ContactTableRow> items and a ObjectProperty<ContactTableRow> selectedItem:

class ContactViewModel {
    private ObservableList<ContactTableRow> items = ...
    private ObjectProperty<ContactTableRow> selectedItem = ...

    // property accessor methods
}

在 View 类中,您现在可以将 viewModel 属性与表视图连接起来,如下所示:

class ContactsView {
    @FXML
    private TableView<ContactTableRow> table;

    private ContactsViewModel viewModel = ...

    public void initialize() {
        table.setItems(viewModel.itemsProperty());

        viewModel.selectedItemProperty().bind(
            table.getSelectionModel().selectedItemProperty());    
}

现在唯一要做的就是在 ViewModel 中创建一些逻辑来加载实际的Contact从数据库中获取 s,将其转换为ContactTableRow实例并将它们放入您的items list.

通过这种方法,您的视图独立于实际的模型类。在这个简单的例子中,它可能看起来像ContactTableRow类是开销,但在现实世界的用例中,这可能变得非常有用。它将表与实际模型类解耦。通过这种方式,您可以在单个表中显示来自多个实体的数据,并且如果数据结构将来发生变化,您只需要重构行类而不是整个表。 ViewModel 独立于实际的 UI 特定类。 viewModel 提供的是 UI 应该做什么的抽象定义:有一些数据的列表,并且可以选择该数据的单个项目。如何向用户呈现此数据列表与 ViewModel 无关。 视图可以取代TableView with a ListView或将来的其他组件,而无需更改 ViewModel。

您可以在示例部分找到此方法的示例mvvmFX https://github.com/sialcasa/mvvmFX图书馆:联系人示例 https://github.com/sialcasa/mvvmFX/tree/develop/examples/contacts-example包含一个主从 https://github.com/sialcasa/mvvmFX/tree/develop/examples/contacts-example/src/main/java/de/saxsys/mvvmfx/examples/contacts/ui/master使用此技术的视图。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JavaFX 中的 MVVM。具有数据模型的控件 的相关文章

  • 领域驱动设计示例(特别是 .NET 重点)

    好的 我已经订购了 但是当我等待它到达时 我正在考虑开始在我当前的项目中应用这些技术 我现在确实很好地掌握了这些概念 但是当我尝试应用它们时 我陷入了执行过程中 最终在各个项目中漏掉了我的职责 因此 我正在寻找可以引导我走向正确方向的资源
  • 存储库模式和 Linq to sql

    我正在尝试使用角色表 用户表和具有用户 ID 角色 ID 的外部参照表来实现用户身份验证和授权 为了实现通用存储库来更新角色 插入角色 添加用户 将用户添加到角色 更新用户 更新用户角色 验证用户 添加用户会话进行审核等 我是否需要为每个存
  • C++ OOP:将哪些函数放入类中?

    假设我有一个a类 class a public void load data private void check data void work data void analyze data 这些函数都对类或其成员之一执行某些操作 然而这个
  • MVVM 在 iOS 中的使用

    我是一名 iOS 开发人员 我对我的项目中存在大量视图控制器感到内疚 因此我一直在寻找更好的方法来构建我的项目 并遇到了 MVVM 模型 视图 视图模型 架构 我读了很多关于 iOS 的 MVVM 文章 但有几个问题 我将用一个例子来解释我
  • WPF 将枚举列表(或类似的)绑定到复选框列表

    我想将复选框列表绑定到 WPF 中的枚举值集合 枚举不是 Flags 语境 它用于过滤数据网格 其中每个项目都有我的枚举的一个实例 它不一定需要绑定到列表 固定大小的集合也可以 假设您想绑定到枚举的所有可能值 您可以使用对象数据提供者 ht
  • 为什么以及如何避免事件处理程序内存泄漏?

    通过阅读 StackOverflow 上的一些问题和答案 我刚刚意识到 使用以下命令添加事件处理程序 在 C 或者我猜 其他 net 语言 中可能会导致常见的内存泄漏 我过去多次使用过这样的事件处理程序 但从未意识到它们可能会导致或已经导致
  • 如何在 Java FX 中以编程方式模拟箭头键按下

    我想让我的 JFX 应用程序模拟箭头键按下 当它们在 TextField 中注册时 但我不知道如何发送字符串或字节以外的任何内容 我正在想象这样的事情 static EventHandler
  • 如何在javascript中实现观察者模式?

    你好 我正在尝试在 JavaScript 中实现观察者模式 我的index js document ready function var ironMan new Movie ironMan setTitle IronMan ironMan
  • 使用 MVVM 模式时,与属性更改相关的代码应该放在 setter 中还是事件中?

    寻找有关在何处放置取决于属性更改的代码的指导 例如 我有一个视图模型 用于保存应用程序设置的状态 public SettingsViewModel ISettingsRepository settings settings settings
  • Java:getInstance 与静态

    目的是什么getInstance 在Java中 在我的研究过程中我一直在读getInstance 有助于实现单例设计模式 根据我的理解 这意味着整个程序中只有一个实例 但我不能只使用静态吗 这不是静态的全部意义吗 如果我只有静态方法和字段
  • 使用 MVVM 在 WPF 中进行 COMBOBOX 过滤

    我正在使用 WPF mvvm 方法开发一个应用程序 我有一个要求 必须在组合框中显示项目列表以供选择 基于一些标志 我需要从组合框中过滤掉一些项目以供选择 我尝试使用两种不同的项目源 一个具有完整列表 另一个具有过滤列表 并基于我想要更改项
  • 如何平滑拖动JavaFX多边形?

    我有一个多边形 三角形 我想让它可以用鼠标拖动 下面是我尝试过的代码 但是使用此代码我无法顺利拖动它 请让我知道如何才能使其顺利拖动 public void start Stage primaryStage throws Exception
  • 组织 jQuery/JavaScript 代码的最佳方式 (2013) [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 问题 这个答案之前已经回答过 但已经
  • 如何将只缓存某些内容的字段添加到ADT?

    我经常需要向 ADT 添加字段 仅记住一些冗余信息 但我还没有完全弄清楚如何又好又高效地做到这一点 说明问题的最好方法是举个例子 假设我们正在使用无类型 lambda 项 type VSym String data Lambda Var V
  • 如何制作抗崩溃的ios应用程序

    我现在正在编写 ios 应用程序一段时间 但我的应用程序仍然经常崩溃 并且需要时间才能使它们变得非常稳定 我觉得这很烦人 那么 有没有关于防崩溃编程ios应用程序的编程模式呢 打开编译器警告 删除所有警告 运行静态分析器 删除所有警告 使用
  • 丰富的领域模型和 ORM

    Martin Fowler 认为贫血领域模型是一种反模式 将持久性模型作为域模型进行滚动似乎也严重偏离 因为对象关系阻抗不匹配 http en wikipedia org wiki Object Relational impedance m
  • 使用策略和工厂模式进行依赖注入

    我正在开展一个业余项目 以更好地理解控制反转和依赖注入以及不同的设计模式 我想知道是否有将 DI 与工厂和策略模式结合使用的最佳实践 当策略 从工厂构建 需要每个可能的构造函数和实现不同的参数时 我面临的挑战就出现了 因此 我发现自己在服务
  • 该组件没有由 uri 标识的资源

    我想创建一个通用数据网格以在我的所有视图 用户控件上使用 这是我的结构 Class Library called Core Class called ViewBase public class ViewBase UserControl pu
  • 如何创建一个显示 Spinners 的 x 和 y 值的表格?

    我想创建一个位于图表右侧的表格 其中显示 2 列 x 和 y 值已输入到xSpin and ySpin旋转器 我已经画了一张我想要桌子放置的位置的图 我尝试过在网格窗格布局中使用文本框来创建表格并将值直接输入到文本框网格中 但是我无法将它们
  • JavaFX ImageView 未更新

    因此 我尝试将图像加载并保存到 imageView 中 其中图像的位置是通过文件浏览器选择的 我已经为此工作好几天了 如果我不能解决这个问题 我就会中风 我已经尝试了我能想到的一切 预先感谢您的帮助 UPDATED 这是我的主要课程 pub

随机推荐

  • 在 Hibernate 中使用 Spring Data 查询时出现 NoViableAltException

    我正在使用指定 Spring Data 查询 Query在存储库方法上 但它抛出了NoViableAltException例外 这是我正在使用的存储库接口方法和注释 Query value SELECT one saveLine two s
  • 对 Julia 中的内存分配和垃圾收集感到困惑

    我对 Julia 中的内存分配有点困惑 我从常见问题解答中知道 http julia readthedocs org en latest manual faq 清除大变量使用的内存是通过将其设置为较小的值 例如 0 然后运行来完成的gc 但
  • Mac OS X 上带有 Cocoa WebView 的综合 Web 服务器

    我想创建一个 Webview 我可以完全控制它加载的内容 本质上 我想提供一个类的实例 它扮演 URL 中指定的各种 Web 服务器的角色 理想情况下 我会为这个 webview 提供一个委托 它会告诉委托它需要的每个 URL 并且委托将使
  • 卓:0.0.0.0/0 和 ::/0 是什么意思?

    在安全组中 我添加的每个入站端口都添加了两条规则 一条为 0 0 0 0 0 另一条为 0 它们分别是什么意思 Internet 协议版本 4 IPv4 中的默认路由被指定 作为 CIDR 表示法中的零地址 0 0 0 0 0 通常称为 四
  • Angular 反应式表单集和清除验证器

    请协助 我想删除表单中的所有验证器 请告知是否可能 如果不可能 如果您有一个包含 20 个或更多表单控件的表单组 删除验证器的更好方法是什么 请参阅下面的示例 ngOnInit this exampleFormGroup this form
  • ExoPlayer 2 的质量选择器

    我目前正在开发一个现场和电影播放器 应用程序 我选择了Exo播放器版本2播放这部电影 我对此了解不多 我想让用户选择电影的质量在播放器屏幕上 例如 720p 或 1080p 等 但我不知道如何获取现有品质的列表并将其显示给用户 下面的代码是
  • LightGBM错误:ValueError:为了提前停止,至少需要一个数据集和评估指标进行评估

    我正在尝试使用 gridsearch 训练 LightGBM 当我尝试训练模型时出现以下错误 ValueError For early stopping at least one dataset and eval metric is req
  • 有没有办法为记事本++、HTML 编码启用智能感知?

    有没有办法为notepad 启用智能感知 我听说最接近的是一个名为 Fingertext 的插件 但我不知道如何使用它 是的 NP v6 6 8 中有一个 默认情况下是禁用的 要启用它 请在菜单栏中导航至 Settings 优先 自动完成
  • chromecast 调试器可以工作,但不显示任何内容?

    我最近安装了 chrome cast 设备并在该设备上启用了调试器模式 将接收器应用程序发送给 google 并从他们那里获取应用程序 ID 将应用程序 ID 设置到我的发件人应用程序中 一切正常 但问题是我在调试器上看不到任何内容 也无法
  • PowerManager.newWakeLock() 抛出 IlleagelArgumentException

    然而 当我打电话时 我正在尝试获取唤醒锁PowerManager newWakeLock 我收到 IlleglArgumentException 这是我用来获取的代码 private void setWakeLock Context con
  • 如何让div中的文本始终位于中间?

    我试图让文本保留在可调整大小的 DIV 中间 这是例子 CSS rightmenu position absolute z index 999999 right 0 height 60 text align center HTML div
  • 如何从 iOS 设备的 iPod 库导出 mp3 文件?

    在我的 iOS 应用程序中 我试图导出mp3文件从 iPod 库复制到设备上应用程序的文档目录 目前我正在尝试使用AVAssetExportSession但它不适合mp3文件 它适用于m4a files 是否可以使用 AVAssetExpo
  • 独立实施和托管实施之间是否存在有意义的区别?

    我的问题主要与第四节第六段 http www iso 9899 info n1570 html 4 p6 合规实施的两种形式是托管式和独立式 合格的托管实施应接受任何严格合格的程序 据我了解 这构成了典型的应用程序环境 包括文件系统 分配的
  • 通过单击缩放按钮放大和缩小图像(Javascript)

    我正在尝试通过两个缩放按钮 和 放大和缩小图像 问题是当图像为全屏尺寸 宽度 100 时 放大 会停止 我需要将图像缩放到比屏幕尺寸大得多 只是不知道如何做到这一点 我是 Javascript 初学者 所以我希望有人有动力帮助我解决这个 J
  • 日期转换程序中的奇怪错误

    我无法修复代码中的奇怪错误 我编写了一个程序来打印最初以 MM DD YYYY 格式编写的日期 格式为 月 DD YYYY 该程序很简单 我将日期存储在char数组 然后用strtok我分别获取月 日 年并存储指向它们的指针 在一个char
  • 如何将 std::string 传递给需要 char* 的函数? [复制]

    这个问题在这里已经有答案了 可能的重复 我可以从 C 字符串中获取非常量 C 字符串吗 https stackoverflow com questions 1919626 can i get a non const c string bac
  • BASH 中多列文件的反向排序顺序

    我有以下文件 1 2 3 1 4 5 1 6 7 2 3 5 5 2 1 我希望文件按第二列排序 但从最大数字 在本例中为 6 到最小数字 我尝试过 sort 1 2 file dat 但它按升序排序 而不是降序 结果应该是 1 6 7 1
  • 命令是否从 shell 脚本中的当前目录运行?

    在 bash shell 脚本中我尝试了这两个版本 java jar abc jar and CMD java jar abc jar CMD 第一个版本可以工作 第二个版本则抱怨找不到 abc jar 为什么 命令确实从 shell 脚本
  • 使用命令行开关将 PDF 另存为文本 - 可以做到吗?

    我需要使用命令行开关来执行 另存为文本 命令 理想情况下 我想要 使用命令行开关打开 PDF 使用命令行开关通过模仿 另存为文本 命令将 PDF 转换为文本文件 使用命令行关闭 PDF 这可能吗 如果是这样 那么有人知道该怎么做吗 也许你可
  • JavaFX 中的 MVVM。具有数据模型的控件

    我在fxml文件中定义了一个TableView 但我无法指定表的列 因为表将具有一些数据模型知识 这会违反MVVM 我创建了一个类 它提供 TableColumn 的集合并提供数据模型 我想更改相对于表中所选项目的按钮状态 如何在不违反MV