Java TableView<;T>;不显示ObservableList的内容<;T>;物体

Java TableView<;T>;不显示ObservableList的内容<;T>;物体,java,javafx,javafx-8,Java,Javafx,Javafx 8,我有两个几乎相似的自定义类来存储简单的字符串数据——它们被称为“Patient”和“Trace”。它们之间的区别只是定义字段的数量不同。这两种方法的构造函数如下所示(使用getVariablesNames()static方法): 公共类患者{ 字符串patientID; 字符串名; 字符串lastName; 字符串性别; 出生日期字符串; 弦年龄; 字符串电子邮件; 字符串电话号码; 字符串城市; 公共患者(字符串patientID、字符串firstName、字符串lastName、字符串性别、

我有两个几乎相似的自定义类来存储简单的字符串数据——它们被称为“Patient”和“Trace”。它们之间的区别只是定义字段的数量不同。这两种方法的构造函数如下所示(使用
getVariablesNames()
static方法):

公共类患者{
字符串patientID;
字符串名;
字符串lastName;
字符串性别;
出生日期字符串;
弦年龄;
字符串电子邮件;
字符串电话号码;
字符串城市;
公共患者(字符串patientID、字符串firstName、字符串lastName、字符串性别、字符串出生日期、字符串年龄、字符串电子邮件、字符串电话号码、字符串城市){
this.patientID=patientID;
this.firstName=firstName;
this.lastName=lastName;
这个。性别=性别;
this.dateOfBirth=出生日期;
这个。年龄=年龄;
this.email=电子邮件;
this.phoneNumber=电话号码;
this.city=城市;
}
公共静态字符串[]getVariablesNames(){
Field[]fields=Patient.class.getDeclaredFields();
String[]variablesNames=新字符串[fields.length];
for(int i=0;i
和“跟踪”类的构造函数:

公共类跟踪{
弦作用;
字符串状态;
字符串消息;
串时间;
公共跟踪(字符串操作、字符串状态、字符串消息、字符串时间){
这个动作=动作;
这个状态=状态;
this.message=消息;
这个时间=时间;
}
公共静态字符串[]getVariablesNames(){
Field[]fields=Trace.class.getDeclaredFields();
String[]variablesNames=新字符串[fields.length];
for(int i=0;i
我使用这些类的对象来填充自定义的
TableView
实例,其中
可以是“Patient”或“Trace”。我遇到的问题是“Trace”对象值没有显示在表中,“Patient”类的对象没有问题。自定义
TableView
类如下所示:

import javafx.collections.ObservableList;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;

public class TableViewCustom<T> extends TableView<T> {

    public TableViewCustom(String[] columnNames, String[] variablesNames, ObservableList<T> data) {
        super();

        @SuppressWarnings("unchecked")
        TableColumn<T, String>[] tableColumns = new TableColumn[variablesNames.length];
        for (int i = 0; i < tableColumns.length; i++) {
            tableColumns[i] = new TableColumn<T, String>(columnNames[i]);
            tableColumns[i].setCellValueFactory(new PropertyValueFactory<T, String>(variablesNames[i]));
        }

        this.setItems(data);
        this.getColumns().addAll(tableColumns);

        this.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY);
    }
}
import javafx.collections.ObservableList;
导入javafx.scene.control.TableColumn;
导入javafx.scene.control.TableView;
导入javafx.scene.control.cell.PropertyValueFactory;
公共类TableView自定义扩展TableView{
public TableViewCustom(字符串[]列名称、字符串[]变量名称、可观察列表数据){
超级();
@抑制警告(“未选中”)
TableColumn[]tableColumns=新的TableColumn[variablesNames.length];
对于(int i=0;i
以及使用“Patient”和“Trace”对象的此自定义TableView的示例实现:

导入javafx.application.application;
导入javafx.collections.FXCollections;
导入javafx.collections.ObservableList;
导入javafx.scene.Parent;
导入javafx.scene.scene;
导入javafx.scene.layout.BorderPane;
导入javafx.scene.layout.VBox;
导入javafx.stage.stage;
公共类演示扩展了应用程序{
公共父级createContent(){
/*布局*/
BorderPane布局=新建BorderPane();
/*布局->中心*/
VBox tableViewsContainer=新的VBox(5);
/*布局->中心->顶部*/
String[]patientColumnNames=新字符串[]{“患者ID”、“名字”、“姓氏”、“性别”、“出生日期”、“年龄”、“电子邮件”、“电话号码”、“城市”};
字符串[]patientVariablesNames=Patient.getVariablesNames();
ObservableList patientData=FXCollections.observableArrayList
public class Trace {

    String action;
    String status;
    String message;
    String time;

    public Trace(String action, String status, String message, String time) {
        this.action = action;
        this.status = status;
        this.message = message;
        this.time = time;
    }

    public static String[] getVariablesNames() {
        Field[] fields = Trace.class.getDeclaredFields();
        String[] variablesNames = new String[fields.length];
        for (int i = 0; i < fields.length; i++) {
            variablesNames[i] = fields[i].getName();
        }
        return variablesNames;
    }

    public void setActionText(String value) {
        action = value;
    }

    public String getActionText() {
        return action;
    }

    public void setStatusText(String value) {
        status = value;
    }

    public String getStatusText() {
        return status;
    }

    public void setMessageText(String value) {
        message = value;
    }

    public String getMessageText() {
        return message;
    }

    public void setTimeText(String value) {
        time = value;
    }

    public String getTimeText() {
        return time;
    }
}
import javafx.collections.ObservableList;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;

public class TableViewCustom<T> extends TableView<T> {

    public TableViewCustom(String[] columnNames, String[] variablesNames, ObservableList<T> data) {
        super();

        @SuppressWarnings("unchecked")
        TableColumn<T, String>[] tableColumns = new TableColumn[variablesNames.length];
        for (int i = 0; i < tableColumns.length; i++) {
            tableColumns[i] = new TableColumn<T, String>(columnNames[i]);
            tableColumns[i].setCellValueFactory(new PropertyValueFactory<T, String>(variablesNames[i]));
        }

        this.setItems(data);
        this.getColumns().addAll(tableColumns);

        this.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY);
    }
}
import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class Demo extends Application {

    public Parent createContent() {

        /* layout */
        BorderPane layout = new BorderPane();

        /* layout -> center */
        VBox tableViewsContainer = new VBox(5);

        /* layout -> center -> top */
        String[] patientColumnNames = new String[] {"Patient ID", "First Name", "Last Name", "Gender", "Date Of Birth", "Age", "Email", "Phone Number", "City"};
        String[] patientVariablesNames = Patient.getVariablesNames();
        ObservableList<Patient> patientData = FXCollections.observableArrayList(new Patient("Patient ID", "First Name", "Last Name", "Gender", "Date Of Birth", "Age", "Email", "Phone Number", "City"));
        TableViewCustom<Patient> patientTableView = new TableViewCustom<Patient>(patientColumnNames, patientVariablesNames, patientData);

        /* layout -> center -> bottom */
        String[] traceColumnNames = new String[] {"Action", "Status", "Message", "Time"};
        String[] traceVariablesNames = Trace.getVariablesNames();
        ObservableList<Trace> traceData = FXCollections.observableArrayList(new Trace("Action", "Status", "Message", "Time"));
        TableViewCustom<Trace> traceTableView = new TableViewCustom<Trace>(traceColumnNames, traceVariablesNames, traceData);

        /* add items to the layout */
        tableViewsContainer.getChildren().addAll(patientTableView, traceTableView);

        layout.setCenter(tableViewsContainer);
        return layout;
    }

    @Override
    public void start(Stage stage) throws Exception {
        stage.setScene(new Scene(createContent()));
        stage.setWidth(700);
        stage.setHeight(400);
        stage.show();
    }

    public static void main(String args[]) {
        launch(args);
    }
}