亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

PropertyValueFactory 模型類中正確的 getter 錯誤

PropertyValueFactory 模型類中正確的 getter 錯誤

BIG陽 2023-02-23 10:26:27
我試圖從 fxml 文件填充示例 javafx TableView。這是我的控制器方法:public class TestController implements Initializable {       @FXML private TableView<user> tableView;        @FXML private TableColumn<user, String> UserId;        @FXML private TableColumn<user, String> UserName;        public void initialize(URL location, ResourceBundle resources) {            UserId.setCellValueFactory(new PropertyValueFactory<user, String>("userId"));            UserName.setCellValueFactory(new PropertyValueFactory<user, String>("userName"));            tableView.getItems().setAll(parseUserList());        }        private List<user> parseUserList(){            List<user> l_u = new ArrayList<user>();            user u = new user();            u.setUserId(1);            u.setUserName("test1");            l_u.add(u);            u.setUserId(2);            u.setUserName("test2");            l_u.add(u);            u.setUserId(3);            u.setUserName("test3");            l_u.add(u);            return l_u;        }}和 fxml 文件:<BorderPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="369.0" prefWidth="505.0" xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="viewmodel.TestController ">   <center>      <TableView fx:id="tableView" prefHeight="200.0" prefWidth="200.0" BorderPane.alignment="CENTER">        <columns>          <TableColumn prefWidth="75.0" text="UserId" fx:id="UserId"/>          <TableColumn prefWidth="75.0" text="UserName" fx:id="UserName"/>        </columns>      </TableView>   </center></BorderPane>最后是我的模型:封裝模型;public class user {    private int userId;    public int getUserId() { return this.userId; }    public void setUserId(int userId) { this.userId = userId; }    private String userName;    public String getUserName() { return this.userName; }    public void setUserName(String userName) { this.userName = userName; }}
查看完整描述

2 回答

?
收到一只叮咚

TA貢獻1821條經驗 獲得超5個贊

雖然違反 Java 命名約定(始終遵循它們?。┖?PropertyValueFactory 的不當使用(如果沒有令人信服的理由,請不要使用它?。┦浅R姷南右扇?,但它們似乎不是 OP 問題中的原因。


錯誤消息表明問題發生在模塊化上下文中:


Jun 28, 2019 12:17:35 PM javafx.scene.control.cell.PropertyValueFactory getCellDataReflectively

WARNING: Can not retrieve property 'userId' in PropertyValueFactory:   

    javafx.scene.control.cell.PropertyValueFactory@638db851 with provided class type: class model.user

java.lang.RuntimeException: java.lang.IllegalAccessException: 

    module javafx.base cannot access class model.user (in module JavaFXTest) 

    because module JavaFXTest does not open model to javafx.base

實際上,該示例在非模塊化上下文中運行得很好,但在模塊化時會失敗。錯誤消息準確地告訴我們該怎么做:打開我們的模塊(或其中的一部分)進行反射訪問。


Module-info 打開完整的模塊或單獨的包:


 // complete

 open module JavaFXTest {

   exports ourpackage;

   ...

 }


 // parts

 module JavaFXTest {

   exports ourpackage;

   opens ourpackage.model;

 }


查看完整回答
反對 回復 2023-02-23
?
炎炎設計

TA貢獻1808條經驗 獲得超4個贊

這是一個很好的例子來說明“為什么你應該使用Callback而不是PropertyValueFactory.”。目前我看不出有任何理由使用 PVF 而不是 Callback。


在這里您可以看到一個缺點,即您在運行該應用程序之前并沒有真正看到您犯了編碼錯誤。由于 PVF 使用反射,如果您沒有正確聲明它們,它就找不到合適的字段。PVF 期望Property-es 正如您在異常中看到的那樣 a是必需的,并且您的班級PropertyRefference中指定的字段都不是esuserProperty


它可以這樣使用,但你必須user像這樣重寫類:


public class User { // use java naming conventions 

    private IntegerProperty userId;


    public int getUserId() { return this.userId.get(); }

    public void setUserId(int userId) { this.userId.set(userId); }

    public IntegerProperty userIdProperty() { return this.userId; }


    private StringProperty userName;


    public String getUserName() { return this.userName.get(); }

    public void setUserName(String userName) { this.userName.set(userName); }

    public StringProperty userNameProperty() {return this.userName; }


    public User(int userId,String userName){

         this.userId = new SimpleIntegerProperty(userId);

         this.userName = new SimpleStringProperty(userName);

    }

}

現在,由于字段是屬性,PropertyValueFactory 會找到它們,但我不建議使用它,因為如您所見,它可能會導致您在運行它之前甚至沒有注意到的問題。


所以不是:


UserId.setCellValueFactory(new PropertyValueFactory<user, String>("userId"));

UserName.setCellValueFactory(new PropertyValueFactory<user, String>("userName"));

使用:


// use java naming conventions (`userId` instead of `UserId`)

userId.setCellValueFactory(data -> data.getValue().userIdProperty().asString()); 

// same here user naming convention

userName.setCellValueFactory(data -> data.getValue().userNameProperty());

我已經寫過幾次評論,但我會在這里再次提到它使用java 命名約定。像 User 而不是 user 和 userId 而不是 UserId 等等......


查看完整回答
反對 回復 2023-02-23
  • 2 回答
  • 0 關注
  • 187 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號