module javafx.基类不能访问类应用程序.客户(在模块FCR),因为模块FCR不打开应用程序到javafx.b



我正在尝试在javafx中显示tableView中的数据。

即使我已经使用了SimpleStringProperty和SimpleIntegerProperty,每次我点击"检查客户"按钮,我得到这个错误:

肇因:java.lang.IllegalAccessException: module javafx。基类不能访问类应用程序。客户(在模块FCR),因为模块FCR没有打开应用程序到javafx.base

at javafx.base/com.sun.javafx.property.MethodHelper.invoke(MethodHelper.java:69)
at javafx.base/com.sun.javafx.property.PropertyReference.getProperty(PropertyReference.java:197)
…98

这是客户的代码:

public class customer {
private final IntegerProperty ID;
private final StringProperty  firstName;
private final StringProperty  lastName;
private final StringProperty  carPlate;
private final IntegerProperty telephoneNum;
public customer(int ID,String firstName, String lastName, String carPlate, int telephoneNum) {
this.ID = new SimpleIntegerProperty();
this.firstName = new SimpleStringProperty();
this.lastName = new SimpleStringProperty();
this.carPlate = new SimpleStringProperty();
this.telephoneNum = new SimpleIntegerProperty();
setID(ID);
setfirstName(firstName);
setlastName(lastName);
setcarPlate(carPlate);
settelephoneNum(telephoneNum);
}
public final StringProperty firstNameProperty() {
return firstName;
}
public final String getfirstName() {
return firstName.get();
}
public final void setfirstName(String fname) {
firstName.set(fname);
}
public final IntegerProperty IDProperty() {
return ID;
}
public final int getID() {
return ID.get();
}
public final void setID(int iD) {
ID.set(iD);
}
public final StringProperty lastNameProperty() {
return lastName;
}
public final String getlastName() {
return lastName.get();
}
public final void setlastName(String lname) {
lastName.set(getfirstName());;
}
public final IntegerProperty telephoneNumProperty() {
return telephoneNum;
}
public final int gettelephoneNum() {
return telephoneNum.get();
}
public final void settelephoneNum(int tnum) {
telephoneNum.set(tnum);;
}
public final StringProperty carPlateProperty() {
return carPlate;
}
public final String getcarPlate() {
return carPlate.get();
}
public final void setcarPlate(String platenum) {
carPlate.set(platenum);
}

这里是控制器:

public class checkCustomers {
private customersData q = Main.q;
@FXML
private TableView table;

@FXML
private TableColumn firstName;
@FXML
private TableColumn lastName;
@FXML
private TableColumn carPlate;
@FXML
private TableColumn telephoneNumber;

@FXML
public void initialize() {

System.out.println(1);
firstName.setCellValueFactory(new PropertyValueFactory<customer, String>("firstName"));
lastName.setCellValueFactory(new PropertyValueFactory<customer, String>("lastName"));
carPlate.setCellValueFactory(new PropertyValueFactory<customer, String>("carPlate"));
telephoneNumber.setCellValueFactory(new PropertyValueFactory<customer, Integer>("telephoneNumber"));
table.setItems(FXCollections.observableArrayList(q.getAllCustomers()));
}

module-info.java代码为:

module FCR {
requires javafx.controls;
requires javafx.fxml;
requires java.sql;
requires javafx.base;
opens application to javafx.graphics, javafx.fxml;
}

我想我应该在模块信息中添加一些东西,有人可以帮助吗?

Open Your Package tojavafx.base

PropertyValueFactory类使用反射来获取命名属性。您必须授予该类的模块(javafx.base)对您的代码的必要访问权限,以便此反射工作。

改变:

opens application to javafx.graphics, javafx.fxml;

:

opens application to javafx.graphics, javafx.fxml, javafx.base;

使用Lambda表达式

另一种选择是不使用PropertyValueFactory。创建这个类很可能是因为JavaFX是在Java 8中添加lambda表达式之前发布的。它使得声明值工厂不那么冗长,但是它有两个问题:

  1. 它使用反射。
    • 不一定不好,但应该尽可能避免反射。
  2. 没有编译时安全性。
    • 如果所需的方法在模型类中不存在,或者如果方法返回错误的类型,那么您只能在运行时发现它。

使用lambda表达式可以避免这两个问题。例如:

lastNameCol.setCellValueFactory(data -> data.getValue().lastNameProperty());

不要使用Raw类型

查看什么是原始类型,为什么我们不应该使用它?Q&。您正在使用TableViewTableColumn的原始类型。不要那样做;声明类型参数

相关内容

  • 没有找到相关文章

最新更新