javafx tableView 不显示数据,getter setter 有啥问题?
Posted
技术标签:
【中文标题】javafx tableView 不显示数据,getter setter 有啥问题?【英文标题】:javafx tableView not showing data, something wrong with getter setters?javafx tableView 不显示数据,getter setter 有什么问题? 【发布时间】:2021-04-23 09:58:42 【问题描述】:我正在尝试将数据填充到我的 tableview 中,一切似乎都很好,但仍然没有显示数据。 这是代码。一切似乎都很好,但 tableview 没有显示任何内容。连眨眼都没有……
public class MainPage implements Initializable
@FXML
private AnchorPane root;
@FXML
private Button main_LogOut;
@FXML
private ComboBox<?> main_Clients;
@FXML
private ComboBox<?> main_Users;
@FXML
private TableView<customerDetails> table;
@FXML
private TableColumn<customerDetails, String> clientId;
@FXML
private TableColumn<customerDetails, String> clientName;
@FXML
private TableColumn<customerDetails, String> clientEmail;
@FXML
private TableColumn<customerDetails, String> clientRequirement;
@SuppressWarnings("unchecked")
@Override
public void initialize(URL arg0, ResourceBundle arg1)
// TODO Auto-generated method stub
clientId.setCellValueFactory(new PropertyValueFactory<customerDetails,String> ("Id"));
clientName.setCellValueFactory(new PropertyValueFactory<customerDetails, String>("name"));
clientEmail.setCellValueFactory(new PropertyValueFactory<customerDetails, String>("email"));
clientRequirement.setCellValueFactory(new PropertyValueFactory<customerDetails, String>("Requirements"));
table=new TableView<customerDetails>();
table.setItems(getClients());
table.getColumns().addAll(clientId,clientName,clientEmail,clientRequirement);
@FXML
void loadScene(ActionEvent event) throws IOException
AnchorPane pane=FXMLLoader.load(getClass().getResource("/lists/MainPage.fxml"));
root.getChildren().setAll(pane);
public ObservableList<customerDetails> getClients()
ObservableList<customerDetails> cd=FXCollections.observableArrayList();
customerDetails details=new customerDetails("moin123","moeen","789987","asdf","email","developer","abcd","adsadasdf","78987");
cd.add(details);
return cd;
和客户模型.....我不知道吸气剂二传手是否有任何问题。我读过一些关于 PropertyValueFactory 的问题。但在这里我希望能得到一点帮助。
public class customerDetails implements Serializable
private String Id;
private String name;
private String phone_Number;
private String current_Address;
private String job_Title;
private String Company;
private String Requirements;
private String annual_Salary;
private String email;
public customerDetails()
public customerDetails(String c_id, String Name, String number, String curr_Add, String j_Title, String company, String req, String salary,String e_mail)
this.Id=c_id;
this.name=Name;
this.phone_Number=number;
this.current_Address=curr_Add;
this.job_Title=j_Title;
this.Company=company;
this.Requirements=req;
this.annual_Salary=salary;
this.email=e_mail;
public String getId()
return Id;
public void setId(String id)
Id = id;
public String getName()
return name;
public void setName(String name)
this.name = name;
public String getPhone_Number()
return phone_Number;
public void setPhone_Number(String phone_Number)
this.phone_Number = phone_Number;
public String getCurrent_Address()
return current_Address;
public void setCurrent_Address(String current_Address)
this.current_Address = current_Address;
public String getJob_Title()
return job_Title;
public void setJob_Title(String job_Title)
this.job_Title = job_Title;
public String getCompany()
return Company;
public void setCompany(String company)
Company = company;
public String getRequirements()
return Requirements;
public void setRequirements(String requirements)
Requirements = requirements;
public String getAnnual_Salary()
return annual_Salary;
public void setAnnual_Salary(String annual_Salary)
this.annual_Salary = annual_Salary;
public String getEmail()
return email;
public void setEmail(String email)
this.email = email;
知道这里有什么问题吗?
【问题讨论】:
您需要遵循命名约定。这可能会解决你的问题。我不确定它是否会,但这就是代码中跳出的内容。 加:不要实例化注入的字段 实例化字段? instantiate 完全正确,抱歉打错了.. 如果您不理解该评论,请阅读有关 java 语言基础的教程和如何使用 fxml 的教程跨度> 【参考方案1】:不要使用 PropertyValueFactory。
如您所见,它依赖于反射。这意味着您必须非常小心地指定正确的字符串,因为编译器无法为您验证它。
一个更好的主意是避免反射,因此编译器可以验证您是否正确拼写了所有内容。
看看the methods of the Node class。请注意,对于每个 get 方法,都有一个相应的方法返回 JavaFX 属性本身吗?这是 JavaFX 中大多数类中的一种模式。
例如,有getBlendMode()
和blendModeProperty()
方法。 getClip()
和 clipProperty()
方法。 getLayoutX()
和 layoutXProperty()
方法。
您的数据类需要遵循相同的约定:
private final StringProperty idProperty = new SimpleStringProperty();
private final StringProperty nameProperty = new SimpleStringProperty();
public String getId()
return idProperty.get();
public void setId(String id)
idProperty.set(id);
public StringProperty idProperty()
return idProperty;
public String getName()
return nameProperty.get();
public void setName(String name)
nameProperty.set(name);
public StringProperty nameProperty()
return nameProperty;
// etc.
为什么要这样做?因为现在可以直接给每一列的 setCellValueFactory 方法传递一个属性:
clientId.setCellValueFactory(f -> f.getValue().idProperty());
clientName.setCellValueFactory(f -> f.getValue().nameProperty());
// etc.
请注意,上面的代码中没有"
字符。因为使用了实际的方法,编译器可以确保你没有犯任何错误。 (避免反射还有其他优点,比如性能。)
但是……正如 Sedrick 指出的那样,这意味着您的类不会真正可序列化。尝试将其写入 ObjectOutputStream 将导致 NotSerializableException,因为 JavaFX 属性本身不是可序列化的。我不清楚您是否真的打算序列化 customerDetails 实例;如果是这样,就需要做更多的工作才能做到这一点。
至于你原来的代码出了什么问题……
在代码中创建一个新的TableView
当您加载 MainPage.fxml 时,您的 table
字段将被更改,因此它指向该 .fxml 文件中定义的 TableView。那就是您在窗口中看到的 TableView。
但是你的代码会这样做:
table=new TableView<customerDetails>();
通过这样做,您创建了 一个不同的 TableView,它在窗口中根本不可见。您正在设置没人看到的 TableView 的项目。
解决方案:完全删除上面的代码行。
属性名称不正确
传递给 PropertyValueFactory 的字符串必须是 bean 属性 名称。 Java bean 也称为 POJO 或普通旧 Java 对象。
Java Bean 规范将 bean 属性定义为 get 方法。 bean 属性的名称定义为 get-method 的名称,不带get
前缀、和下一个小写字母。
由于你的customerDetails 类有一个getId
方法,相应的bean 属性的名称是id
。请注意,一旦“get”被删除,首字母是小写的。这很关键。 Bean 属性区分大小写。
当您的代码执行new PropertyValueFactory<customerDetails,String>("Id")
时,您传递的是一个不存在的属性。 customerDetails 类没有名为“Id”的属性,因此值工厂不可能返回任何数据。但是,该类确实有一个名为“id”的属性。大小写很重要:“id”正确,“Id”不正确。
编译器编译代码,但不执行它。因此编译器不知道该字符串与 customerDetails 中任何 bean 属性的名称都不匹配。这就是为什么反射是危险的。使用编译器可以验证的代码更安全、更健壮。
【讨论】:
使用您的想法,OP 肯定会遇到不同的问题。public class customerDetails implements Serializable
.
较低的驼峰式大小写不起作用。我按你说的用了正确的命名方法但还是没有结果.....
很好的解释 :) 这里只是问题的一部分 - 另一部分是 OP 正在填充的表格不是场景图中的表格..
@kleopatra 啊,是的,这当然是一个基本问题。答案已更新。正如 Sedrick 正确指出的那样,还更新以解决序列化问题。以上是关于javafx tableView 不显示数据,getter setter 有啥问题?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 JavaFx TableView 中添加 TableView 页脚
使用 tableview (JavaFX) 绑定 hashmap