gpt4 book ai didi

java - TableView 不显示 ObservableList 对象的内容

转载 作者:行者123 更新时间:2023-11-29 05:20:39 29 4
gpt4 key购买 nike

我有两个几乎相似的自定义类来存储简单的字符串数据——它们被称为“Patient”和“Trace”。它们彼此的区别仅在于定义字段的数量。两者的构造函数如下所示(使用 getVariablesNames() 静态方法):

public class Patient {

String patientID;
String firstName;
String lastName;
String gender;
String dateOfBirth;
String age;
String email;
String phoneNumber;
String city;

public Patient(String patientID, String firstName, String lastName, String gender, String dateOfBirth, String age, String email, String phoneNumber, String city) {
this.patientID = patientID;
this.firstName = firstName;
this.lastName = lastName;
this.gender = gender;
this.dateOfBirth = dateOfBirth;
this.age = age;
this.email = email;
this.phoneNumber = phoneNumber;
this.city = city;
}

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

public String getPatientID() {
return patientID;
}

public void setPatientID(String value) {
patientID = value;
}

public String getFirstName() {
return firstName;
}

public void setFirstName(String value) {
firstName = value;
}

public String getLastName() {
return lastName;
}

public void setLastName(String value) {
lastName = value;
}

public String getGender() {
return gender;
}

public void setGender(String value) {
gender = value;
}

public String getDateOfBirth() {
return dateOfBirth;
}

public void setDateOfBirth(String value) {
dateOfBirth = value;
}

public String getAge() {
return age;
}

public void setAge(String value) {
age = value;
}

public String getEmail() {
return email;
}

public void setEmail(String value) {
email = value;
}

public String getPhoneNumber() {
return phoneNumber;
}

public void setPhoneNumber(String value) {
phoneNumber = value;
}

public String getCity() {
return city;
}

public void setCity(String value) {
city = value;
}
}

和“Trace”类的构造函数:

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

我使用这些类的对象来填充自定义 TableView<T>实例,其中 <T>可以是“Patient”或“Trace”。我遇到的问题是“Trace”对象的值没有显示在表中,而“Patient”类的对象没有问题。定制TableView<T>类如下所示:

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

以及使用“Patient”和“Trace”对象的自定义 TableView 的示例实现:

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

Demo.java应用运行结果如下图所示:

enter image description here

PS 我没有收到任何错误。

最佳答案

问题是您传递给 PropertyValueFactory 的值与 get...() 定义的属性名称不匹配和 set...(...)方法。

因为您使用反射来查找您定义的字段(不是属性)的名称,对于Trace对传递给 PropertyValueFactory 的值进行分类是“ Action ”、“状态”、“消息”和“时间”。因此 TableView 将尝试通过调用 getAction() 来填充列的值。 , getStatus() , getMessage() , 和 getTime()Trace 上每行中的对象。由于没有此类方法,因此不会显示任何值。

要解决此问题,您可以执行以下操作之一:

  1. getVariablesNames() 中定义的值进行硬编码返回属性名称的方法(即 return new String[] {"actionText", "statusText", "messageText", "timeText"}; )。由于您在每个类中重复该方法而不是重用它,因此不会使事情变得更冗长,而且这可能会表现得更好(尽管您不太可能在实践中观察到任何差异)。
  2. 使用反射,但查找已声明方法的名称,找到所有以“get”或“is”开头的方法,去掉该前缀,并将剩余部分的第一个字符小写。
  3. 使字段名称与属性名称匹配(即将字段声明为 actionText 等)。这当然会对您的类定义施加约定要求。

关于java - TableView<T> 不显示 ObservableList<T> 对象的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24913409/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com