当前位置: 首页 > 知识库问答 >
问题:

具有不同对象的TableView(javafx)

家经纶
2023-03-14

我目前正在开发一个应用程序,用于查看谁负责不同的病人,但是我还没有解决如何用不同的对象类型填充一个表格。

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

我希望我的表包含患者对象、用户对象(负责)和关系管理器对象。

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

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());
    }
}

关系数据是返回的关系管理器对象。此对象包含一个用户对象、一个患者对象和一个责任对象。

最好的,西蒙。

共有1个答案

公羊学义
2023-03-14

如何执行此操作的确切详细信息取决于您的要求:例如,对于给定的 RelationManager 对象,与其关联的用户、患者或负责人对象是否会更改?是否需要该表可编辑?

但基本思想是表中的每一行都代表一些关系管理器,所以表类型是TableView

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

如果与给定的< code > relationship manager 相关联的各个对象从不改变(例如,给定的< code > relationship manager 的< code>Patient总是相同的),那么这就相当简单了。假设您有< code >患者的常规设置:

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());
    }
});

但是请注意,如果您将患者的姓名外部更改为表,这将不会更新。

但是,如果与关系管理器关联的患者对象被更改,这些都不起作用(单元格仍将观察到错误的afstName属性())。在这种情况下,您需要一个可观察的值,该值在“中间”患者属性或第一个名称属性更改时发生变化。JavaFX有一个BindingsAPI和一些选择(…)方法可以做到这一点:不幸的是,在JavaFX 8中,如果沿途的任何对象为空,它们将在TableView上下文中向控制台发出大量警告。在这种情况下,我建议查看EasyBinda框架,它将允许您执行以下操作

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

(EasyBinda需要JavaFX 8,所以如果你可以使用它,你也可以使用lambda表达式和方法引用:)。)

在这两种情况下,如果您希望表格是可编辑的,那么对于可编辑的单元格,还需要做一些额外的工作,将编辑提交连接到适当的调用来设置属性。

 类似资料:
  • 以前我没有得到任何错误,但突然我开始得到错误:

  • 问题内容: 我正在练习继承。 我有两个相似的类,我想将其同化为一个数组,因此我想将Object类用作超类,因为所有内容都是Object的子类。 因此,例如,我将T类和CT类放入一个名为all的数组中,如下所示: 我跳过了声明,因为那不是我的问题。 当我希望使用循环在数组内调用函数时,我真正的问题就变成了: T和CT分别涉及的类都具有beingShot方法,该方法是公共的。 Eclipse建议将它们

  • 我有一个标准的Spring/JPA/Hibernate设置。带有@Transactional的服务方法,它使用两个不同的DAO,每个DAO都注入了自己的EntityManager实例。 当查询时,什么是最终相同的实体(直接和间接检索),它们被表示为不同的对象,即使对于相同的hibernate会话(事务)它们应该是相同的对象。

  • 问题内容: 我以为运算符检查对象的相等性。但事实并非如此: 问题答案: *Python *将相同的内存 位置用于方法和,这是*两个对象,它们的生命周期不重叠,因此对它们返回相同的标识。请参阅下面的详细说明。 从is运算符的文档中: 运算符是否测试对象标识:并且仅当x和y是同一对象时,x is y才是true。 从ID的文档中 返回对象的“身份”。这是一个整数(或长整数),在此对象的生存期内,此整数

  • 问题内容: 我有一个JUnit测试失败,因为毫秒不同。在这种情况下,我不在乎毫秒。如何更改断言的精度以忽略毫秒(或我希望将其设置为任何精度)? 我想通过的断言示例: 问题答案: 使用具有仅显示您要匹配的部分的格式的对象,并对所得的字符串进行处理。您还可以轻松地将其包装在自己的方法中。

  • 问题内容: 我尝试过一些关于绑定和未绑定方法的代码。当我们调用它们时,我认为它们都会返回对象。但是,当我用于获取一些信息时,它返回的内容我并不理解。 IDE:Eclipse 插件:pydev 输出是… 为什么#1和#2返回相同的ID?他们不是不同的对象吗?如果我们分配和两个变量,#3,#4回报不同的ID。 我认为#3和#4表明它们不是同一对象,而是#1和#2 … 绑定方法的ID和未绑定方法的ID有