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&lt;customerDetails,String&gt;("Id") 时,您传递的是一个不存在的属性。 customerDetails 类没有名为“Id”的属性,因此值工厂不可能返回任何数据。但是,该类确实有一个名为“id”的属性。大小写很重要:“id”正确,“Id”不正确。

编译器编译代码,但不执行它。因此编译器不知道该字符串与 customerDetails 中任何 bean 属性的名称都不匹配。这就是为什么反射是危险的。使用编译器可以验证的代码更安全、更健壮。

【讨论】:

使用您的想法,OP 肯定会遇到不同的问题。 public class customerDetails implements Serializable. 较低的驼峰式大小写不起作用。我按你说的用了正确的命名方法但还是没有结果..... 很好的解释 :) 这里只是问题的一部分 - 另一部分是 OP 正在填充的表格不是场景图中的表格.. @kleopatra 啊,是的,这当然是一个基本问题。答案已更新。正如 Sedrick 正确指出的那样,还更新以解决序列化问题。

以上是关于javafx tableView 不显示数据,getter setter 有啥问题?的主要内容,如果未能解决你的问题,请参考以下文章

Javafx tableview 未在所有列中显示数据

JavaFX - 使 TableView 高度适应行数

如何在 JavaFx TableView 中添加 TableView 页脚

使用 tableview (JavaFX) 绑定 hashmap

用于大型数据库表的 JavaFx TableView CRUD

JAVAFX的TableView基本用法