具有不同对象的 TableView (javafx)

2023-12-10

我目前正在开发一个应用程序,用于观察谁负责不同的患者,但是我无法解决如何用不同的对象类型填充表格的问题。

下面是我的 TableView 控制器的代码。 UITableView 最终将有四种不同的对象类型,所有对象类型都将从数据库中检索。

我希望我的表能够保存患者对象、用户对象(负责)和相​​关管理器对象。

以下是我的代码,如果您需要更多代码,请告诉我:-)。

package fird.presentation;


import fird.Patient;
import fird.RelationManager;
import fird.User;
import fird.data.DAOFactory;
import fird.data.DataDAO;
import java.net.URL;
import java.util.Arrays;
import java.util.List;
import java.util.ResourceBundle;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Button;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;
import javafx.scene.control.cell.PropertyValueFactory;

/**
 * FXML Controller class
 *
 * @author SimonKragh
 */
public class KMAMainFrameOverviewController implements Initializable {

    @FXML
    private TextField txtCPRKMAMainFrame;
    @FXML
    private TableColumn<Patient, String> TableColumnCPR;
    @FXML
    private TableColumn<Patient, String> TableColumnFirstname;
    @FXML
    private TableColumn<Patient, String> TableColumnSurname;
    @FXML
    private TableColumn<User, String> TableColumnResponsible;
    @FXML
    private TableColumn<RelationManager, String> TableColumnLastEdited;
    @FXML
    private TableView<RelationManager> tblPatients;
    @FXML
    private Button btnShowHistory;
    @FXML
    private TableColumn<?, ?> TableColumnDepartment;

    /**
     * Initializes the controller clas @FXML private Button btnShowHistory;
     *
     * @FXML private TableColumn<?, ?> TableColumnDepartment; s.
     */
    @Override
    public void initialize(URL url, ResourceBundle rb) {

        // Start of logic for the KMAMainFrameOverviewController
        DataDAO dao = DAOFactory.getDataDao();
        TableColumnCPR.setCellValueFactory(new PropertyValueFactory<Patient, String>("CPR"));
        TableColumnFirstname.setCellValueFactory(new PropertyValueFactory<Patient, String>("Firstname"));
        TableColumnSurname.setCellValueFactory(new PropertyValueFactory<Patient, String>("Surname"));
        TableColumnResponsible.setCellValueFactory(new PropertyValueFactory<User, String>("Responsible"));
        TableColumnLastEdited.setCellValueFactory(new PropertyValueFactory<RelationManager, String>("Last Edited"));
        ObservableList<RelationManager> relationData = FXCollections.observableArrayList(dao.getAllActiveRelations());
        tblPatients.setItems(relationData);
        tblPatients.getColumns().addAll(TableColumnCPR, TableColumnFirstname, TableColumnSurname, TableColumnResponsible, TableColumnLastEdited);
        System.out.println(tblPatients.getItems().toString());
    }
}

relationData 是返回的 RelationManager 对象。该对象包含一个 User 对象、一个 Patient 对象和一个 Responsible 对象。

最好的, 西蒙.


如何执行此操作的具体细节取决于您的需求:例如,对于给定的 RelationManager 对象,与其关联的 User、Patient 或 Responsible 对象是否会发生变化?您需要该表可编辑吗?

但基本思想是表中的每一行代表一些RelationManager,所以表类型是TableView<RelationManager>。每列显示某种类型的值(称之为S),所以每一列都是类型TableColumn<RelationManager, S>, where S从一列到下一列可能有所不同。

单元格值工厂是一个对象,指定如何从RelationManager对象为类型的可观察值S。执行此操作的确切方法取决于模型类的设置方式。

如果与给定关联的各个对象RelationManager永远不会改变(例如Patient对于给定的RelationManager总是相同的),那么就非常简单了。假设您有通常的设置Patient:

public class Patient {
    private StringProperty firstName = new SimpleStringProperty(...);
    public StringProperty firstNameProperty() {
        return firstName ;
    }
    public String getFirstName() {
        return firstName.get();
    }
    public void setFirstName(String firstName) {
        this.firstName.set(firstName);
    }
    // etc etc
}

那么你就可以做

TableColumn<RelationManager, String> firstNameColumn = new TableColumn<>("First Name");
firstNameColumn.setCellValueFactory(new Callback<CellDataFeatures<RelationManager,String>, ObservableValue<String>>() {
    @Override
    public ObservableValue<String> call(CellDataFeatures<RelationManager, String> data) {
        return data.getValue() // the RelationManager
           .getPatient().firstNameProperty();
    }
});

如果您不使用 JavaFX 属性,则可以使用与PropertyValueFactory用途,即:

TableColumn<RelationManager, String> firstNameColumn = new TableColumn<>("First Name");
firstNameColumn.setCellValueFactory(new Callback<CellDataFeatures<RelationManager,String>, ObservableValue<String>>() {
    @Override
    public ObservableValue<String> call(CellDataFeatures<RelationManager, String> data) {
        return new ReadOnlyStringWrapper(data.getValue().getPatient().getFirstName());
    }
});

但请注意,如果您在表外部更改患者姓名,则此信息不会更新。

但是,如果与关系管理器关联的患者对象发生更改,则所有这些都不起作用(单元格仍会观察到错误的信息)firstNameProperty())。在这种情况下,您需要一个可观察值,该值在“中间”患者属性或firstNameProperty 更改时发生更改。 JavaFX 有一个BindingsAPI 与一些select(...)可以做到这一点的方法:不幸的是,在 JavaFX 8 中,如果沿途任何对象为空,它们会向控制台发出大量警告,它们将在TableView语境。在这种情况下,我建议查看EasyBind框架,它允许你做类似的事情

firstNameColumn.setCellValueFactory( data -> 
    EasyBind.select(data.getValue().patientProperty())
        .selectObject(Patient::firstNameProperty));

(EasyBind 需要 JavaFX 8,因此如果您要使用它,您还可以使用 lambda 表达式和方法引用:)。)

在任何一种情况下,如果您希望表格可编辑,则在将编辑提交返回到设置属性的适当调用方面,需要对可编辑单元格做一些额外的工作。

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

具有不同对象的 TableView (javafx) 的相关文章

  • JavaFX 自定义列表单元格,updateItem 被多次调用

    我正在使用一个ListView在 JavaFX 应用程序中 列表中的项目需要的不仅仅是一个字符串来显示它们 所以我做了一个自定义实现ListCell
  • 如何在 jQuery 中检查 null 对象

    我正在使用 jQuery 我想检查页面中是否存在某个元素 我写了以下代码 但它不起作用 if btext i null alert btext i text btext i text Branch i 如何检查元素是否存在 检查jQuery
  • Angular 4 默认单选按钮默认选中

    我试图根据从对象获得的值将单选按钮标记为默认值 它可以是 True 或 False 根据选项 我可以做什么来标记为默认单选按钮
  • FXML 文档拒绝导入其他 fxml 文件

    我的程序有一个主要的 FXML 文档 其中包含TabPane 对于每个选项卡 我希望它有自己的控制器和 fxml 文件 当我尝试将外部 fmxl 文件包含到主 fxml 文档中时 我的程序拒绝运行 这是我的主要 FXML 文档 这是我的 j
  • Actionscript 对象的属性数量

    如何获取通用 Actionscript 对象中的属性数量 如数组长度 您必须循环所有元素才能对它们进行计数 function objectLength myObject Object int var cnt int 0 for var s
  • 访问 java jigsaw 模块中的资源文件[重复]

    这个问题在这里已经有答案了 我正在尝试从项目中的类访问 Eclipse 项目中的文件 我需要将该项目声明为 jigsaw 模块才能从其他项目访问它 但是通过这样做 我无法再访问项目中的 example png 等文件 这是我的项目结构 pr
  • 如何将对象转换为传递给函数的类型?

    这不会编译 但我想做的只是将对象转换为传递给函数的 t public void My Func Object input Type t t object ab TypeDescriptor GetConverter t ConvertFro
  • JavaFX 2:TableView:删除标题+空时显示网格

    我有两个关于 Javafx 2 中的 TableView 的问题 1 是否可以隐藏表格中的标题 2 当表为空时 它只显示一个白色窗格 上面写着 表中没有内容 是否可以更改此设置以显示默认网格 即使表格为空 如果可能的话 我想要一个带有 CS
  • 如何使对象“a == b”的比较成立? [复制]

    这个问题在这里已经有答案了 这是面试前 JavaScript 在线测试的问题之一 function F var a new F var b new F Q 如何进行比较a b to be true e g console log a b t
  • “过滤”JSON 以获得唯一键并获取所有相关值

    找到一个组中所有可能的相关值的最佳方法是什么 var table group a stuff new group a stuff old group b stuff newOld group b stuff old group c stuf
  • 从剪贴板获取图像 Awt 与 FX

    最近 我们的 Java FX 应用程序无法再从剪贴板读取图像 例如 用户在 Microsofts Paint 中选择图像的一部分并按复制 我不是在谈论复制的图像文件 它们工作得很好 我很确定它过去已经有效 但我仍然需要验证这一点 尽管如此
  • 按日期对图表中的 X 轴进行排序 - JavaFX

    如何按日期对折线图 X 轴进行排序 现在我的折线图看起来像这样 我试图剪切日期并将其转换为 int 但现在我不知道该怎么办 datesToCompare addAll LastHoursAndDates keySet dates in St
  • 如何根据 JavaFX 8 中的特定祖先获取节点边界?

    我在 AnchorPane 中添加了一个图表 我想获取其绘图的范围 图表 我用青色标记 这样我就可以在它上面添加一些文本 但我应该根据它的祖先知道它的确切边界 如果我手动执行此操作 则在调整大小等时更改节点的填充大小时 我可能会失败 imp
  • PHP 对象创建和内存使用

    一个基本的虚拟类 class foo var bar 0 function foo function boo echo memory get usage echo n foo new foo echo memory get usage ec
  • 字符串化 JavaScript 对象

    我正在寻找字符串化一个对象 我想要这样的输出 1 valeur dalebrun usager experttasp date 2013 08 20 16 41 50 2 valeur test usager experttasp date
  • 如何从 Xib 文件加载自定义 UITableViewCell?

    问题很简单 如何加载自定义UITableViewCell来自 Xib 文件 这样做可以让您使用 Interface Builder 来设计您的单元 由于内存管理问题 答案显然并不简单 这个线程 https stackoverflow com
  • 文本视图不显示全文

    我正在使用 TableLayout 和 TableRow 创建一个简单的布局 其中包含两个 TextView 这是代码的一部分
  • 如何销毁一个物体?

    据我所知 很少 有两种方法 var new object Then Method 1 Set to null var null Method 2 Unset unset var 还有其他更好的方法吗 我在这里吹毛求疵吗 您正在寻找unset
  • JavaFX 中 WebView 的性能

    我有一个 HTML5 UI 和一个 Java 后端 并且希望避免在纯 java 中重建 HTML ui 所以我的想法是运行本地 Web 服务器并使用 WebView 在 本机 窗口中呈现它 解决方案似乎是使用可以嵌入到 swing 中的 J
  • JavaFX ReadOnlyListProperty 不是只读的?

    这段代码抛出 UnsupportedOperationException 正如我所期望的那样 因为它是只读的 ListProperty

随机推荐

  • Beam/Dataflow 中的批量 PCollection

    我在 GCP Dataflow Apache Beam 中有一个 PCollection 我不需要一一处理 而是需要 按N 组合 就像是grouped N 因此 在有界处理的情况下 它将按批次中的 10 个项目和最后一批中剩余的项目进行分组
  • Java + SSH + Postgres

    我们正在实施一个大学项目 Java 的拼车服务 我们需要解决一个与 如何管理 postgres 服务器 相关的问题 PostgreSQL 数据库配置在名为 golem 130 136 4 sth 的实验室服务器中 只能通过同一子网 130
  • 关于Scala变量可变性的问题

    我明白那个val关键字确定基础变量是不可变类型 以后不能重新分配 现在我在 scala 编程中遇到了一段 第 3 章 scala 中的后续步骤 用类型参数化数组 它指出 val greetStrings Array String new A
  • 等待光标并禁用 java 应用程序

    我想让用户按下按钮来启动后台线程 当线程正在处理时 我希望发生两件事 1 应显示 WAIT CURSOR 2 应用程序不应响应鼠标事件 根据setCursor 文档 当该组件的 contains 方法针对当前光标位置返回 true 时 将显
  • Swift:无法在某些闭包中分解元组(例如,通过枚举减少)?

    当使用map 和enumerate 时 Swift将分解枚举元组 map enumerate 1 2 3 index element in index element 然而 这似乎不能与额外的闭包参数一起使用 例如 使用reduce red
  • 相同的视图控制器加载两次

    我读过关于这个问题的几篇文章 但没有一个能解决我的问题 我正在编写一个应用程序 我必须单击一个按钮 准备 才能转到以下 ViewController 单击按钮时 它还会在两个视图控制器之间传递数据 问题是 当我单击按钮时 以下 ViewCo
  • ActionView 中的 Yield 魔法是如何发挥作用的?

    I was 看着content for 是如何工作的并观察到block call in the capture erb with buffer方法 它显然神奇地写入了缓冲区变量 然后该变量被修剪 但是 我认为这已被弃用 您可以致电现在 这是
  • 为什么RSA加密用C#和Java返回不同的结果?

    I using 时间 2019 03 17 标签 c RSACryptoServiceProvider JAVA KeyFactory getInstance RSA 密码 我将公钥 指数 模数 作为字节数组从java发送到c 没关系 有相
  • 如何在 dot net core 3.0/3.1 上的 razor 页面中添加区域?

    我想在 core 3 1 中添加区域剃刀页面 但微软文档是为了asp点网核心2 2 他们想要创建一个2020 年 1 月新报告 有人知道如何向核心 3 1 添加区域吗 我在谷歌上搜索了很多 但找不到答案 在 AdminLayout 中 a
  • 如何在SVN中存储配置参数?

    与许多项目一样 我们部署到许多环境 QA UA 开发人员主干等 在 SVN 中存储敏感配置参数的最佳方式是什么 或者 您不应该只在服务器上维护一个较小的未版本化文件 其中包含凭据吗 主要是 我们不想向每个开发人员公开生产凭据 我宁愿提供配置
  • Win10 Powershell - 简单的 If/Elseif 取决于条件顺序?

    我正在尝试编写一个部署脚本来检查操作系统主要版本 然后基于该版本运行命令 我可以抓住它就好 System Environment OSVersion Version Major 但是当我尝试在 if elseif 语句中使用它时 我总是得到
  • 高分辨率移动设备 1080px(Xperia Z 等)的媒体查询

    我正在尝试掌握不同设备的媒体查询 我尝试了我的新索尼 Xperia Z 手机 由于分辨率高 可以以全尺寸网站格式显示 如何添加媒体查询来重新调整网格大小和格式 如标准手机比例 在 Xperia 上 字体也太小而无法阅读 需要显示得更大 对于
  • 为什么需要“string DB 20, 22 dup('?')”中的“20, 22”?

    我一直用 for 定义字符串DB 20 22有一段时间不知道为什么 我读到第一个字节是缓冲区大小 第二个字节保存字符串使用的字节数 但我不知道这两个值是否都是强制性的 例如 当我定义一个字符串并想要将寄存器指向它时 我必须使用 2 来跳过这
  • 关于在需要常量表达式的上下文中使用左值常量表达式的问题

    include
  • Spring Boot 应用程序 - 服务器上下文路径

    我使用 Spring Initializer 嵌入式 Tomcat Thymeleaf 模板引擎生成了一个 Spring Boot Web 应用程序 并将其打包为可执行 JAR 文件 使用的技术 Spring Boot 2 0 0 M6 J
  • 即使安装 m2e + DWM 后,Eclipse Indigo SR2 EE 中也没有 Maven 菜单项

    我已经安装了 Eclipse Indigo SR2 EE Eclipse Java EE IDE for Web Developers Version Indigo Service Release 2 Build id 20120216 1
  • 我应该信任哪个编译器?

    这将是一个新手问题 但我正在尝试做一个小练习C语言 不C 我遇到了一些问题 假设我想在方法中使用数组 其大小取决于参数之一 void someFunc int arSize char charArray arSize DO STUFF 当我
  • 抛出或尝试捕获

    决定是否添加时的一般经验法则是什么throws方法的子句或使用try catch 从我自己读到的内容来看 throws当调用者破坏了契约 传递的对象 并且try catch当在方法内部执行的操作期间发生异常时应使用 它是否正确 如果是这样
  • 根据 WooCommerce 中其他运输方式的可用性隐藏运输方式

    我试图根据其他运输方式 通过其 ID 的可用性来隐藏运输方式 以实现稍微复杂的运输设置 根据我发现的其他代码片段 对于其他用例 排除州或仅显示免费送货 如果有 我想出了这个 function hide duplicate shipping
  • 具有不同对象的 TableView (javafx)

    我目前正在开发一个应用程序 用于观察谁负责不同的患者 但是我无法解决如何用不同的对象类型填充表格的问题 下面是我的 TableView 控制器的代码 UITableView 最终将有四种不同的对象类型 所有对象类型都将从数据库中检索 我希望