Java PropertyValueFactory是否需要模型中的valueProperty方法?

Java PropertyValueFactory是否需要模型中的valueProperty方法?,java,javafx-8,Java,Javafx 8,我正在尝试使用TableView创建一个表,并根据Actors对象列表填充它。演员模型是贝娄 public class Actor { private SimpleIntegerProperty actorId; private SimpleStringProperty firstName; private SimpleStringProperty lastName; private SimpleStringProperty email; publi

我正在尝试使用TableView创建一个表,并根据Actors对象列表填充它。演员模型是贝娄

public class Actor {

    private SimpleIntegerProperty actorId;
    private SimpleStringProperty firstName;
    private SimpleStringProperty lastName;
    private SimpleStringProperty email;


    public Actor(int id, String first, String last, String e){
        actorId = new SimpleIntegerProperty(id);
        firstName = new SimpleStringProperty(first);
        lastName = new SimpleStringProperty(last);
        email = new SimpleStringProperty(e);
    }

    public void setActorId(int id){
        actorId.set(id);
    }
    public int getActorId(){
        return actorId.get();
    }

    public void setFirstName(String name){
        firstName.set(name);
    }
    public String getFirstName(){
        return firstName.get();
    }

    public void setLastName(String last){
        lastName.set(last);
    }
    public String getLastName(){
        return lastName.get();
    }

    public void setEmail(String e){
        email.set(e);
    }


    public String getEmail(){
        return email.get();
    }

}
这是我的桌面课

public class SakilaApp extends Application {

    private TableView<Actor> actorTable = new TableView<Actor>();

    private final ObservableList<Actor> actorData = FXCollections.observableArrayList(
            new Actor(1, "Mohsen","Parsa", "Mohseh.parsa313@gmail.com"),
            new Actor(2, "Morteza","Ghasemi", "Morteza.Ghasemi@gmail.com"),
            new Actor(3, "Mohammad","Fetrat", "Mohammad.Fetrat@gmail.com"),
            new Actor(4, "Nader","AhmadYar", "Nader.AhmadYar@gmail.com" )
            );

    @SuppressWarnings("unchecked")
    @Override
    public void start(Stage stage) {
        Scene scene = new Scene(new Group());
        stage.setTitle("Table View Sample");
        stage.setWidth(600);
        stage.setHeight(500);
        final Label label = new Label("Address Book");
        label.setFont(new Font("Arial", 20));



        actorTable.setEditable(true);

        TableColumn<Actor, Integer> idCol = new TableColumn<Actor, Integer>("Actor ID");
        idCol.setCellValueFactory(
                new PropertyValueFactory<Actor, Integer>("actorId"));
        idCol.setPrefWidth(60);

        TableColumn<Actor, String> firstNameCol = new TableColumn<Actor, String>("First Name");
        firstNameCol.setCellValueFactory(
                new PropertyValueFactory<Actor, String>("firstName"));  
        firstNameCol.setPrefWidth(100);


        TableColumn<Actor, String> lastNameCol = new TableColumn<Actor, String>("Last Name");
        lastNameCol.setCellValueFactory(
                new PropertyValueFactory<Actor, String>("lastName"));
        lastNameCol.setPrefWidth(100);

        TableColumn<Actor, String> emailCol = new TableColumn<Actor, String>("Email");
        emailCol.setCellValueFactory(
                new PropertyValueFactory<Actor, String>("email"));
        emailCol.setPrefWidth(200);



        TableColumn<Actor, String> lastUpdateCol = new TableColumn<Actor, String>("Last Update");
        lastUpdateCol.setCellValueFactory(
                new PropertyValueFactory<Actor, String>("lastUpdate"));
        lastUpdateCol.setPrefWidth(100);

        actorTable.getColumns().addAll(idCol, firstNameCol, lastNameCol, emailCol);
        actorTable.setItems(actorData);

        final VBox actorBox = new VBox();
        actorBox.setSpacing(5);
        actorBox.setPadding(new Insets(10, 0, 0, 10));
        actorBox.getChildren().addAll(label, actorTable);

        ((Group) scene.getRoot()).getChildren().addAll(actorBox);
        stage.setScene(scene);
        stage.show();

    }
    public static void main(String args[]){
        Application.launch(args);
    }
}
但正如您在Actor模型中看到的,没有任何名称为的方法

IntegerProperty actorIdProperty()
我的问题是,我们是否需要这样的方法?
如果有必要,为什么该代码工作正常?

PropertyValueFactory的JavaDoc声明您需要一个名为

SimpleIntegerProperty actorIdProperty;
所以我真的认为你应该

但是,查看PropertyValueFactory的代码,我注意到,如果属性字段不可用,它将返回到getter:

if (propertyRef.hasProperty()) {
    return propertyRef.getProperty(rowData);
} else {
    T value = propertyRef.get(rowData);
    return new ReadOnlyObjectWrapper<T>(value);
}
if(propertyRef.hasProperty()){
返回propertyRef.getProperty(rowData);
}否则{
T值=propertyRef.get(rowData);
返回新的ReadOnlyObjectWrapper(值);
}
因此,这就是为什么您的代码按原样工作


如果我是你,我会遵循JavaDoc并将你的字段重命名为actorIdProperty,因为你永远不知道他们什么时候可以更改实现

PropertyValueFactory的JavaDoc声明您需要一个名为

SimpleIntegerProperty actorIdProperty;
所以我真的认为你应该

但是,查看PropertyValueFactory的代码,我注意到,如果属性字段不可用,它将返回到getter:

if (propertyRef.hasProperty()) {
    return propertyRef.getProperty(rowData);
} else {
    T value = propertyRef.get(rowData);
    return new ReadOnlyObjectWrapper<T>(value);
}
if(propertyRef.hasProperty()){
返回propertyRef.getProperty(rowData);
}否则{
T值=propertyRef.get(rowData);
返回新的ReadOnlyObjectWrapper(值);
}
因此,这就是为什么您的代码按原样工作


如果我是你,我会遵循JavaDoc并将你的字段重命名为actorIdProperty,因为你永远不知道他们什么时候可以更改实现

取决于你所说的“工作”:-)

只要TableView是只读的,getter/setter就足够了:数据按预期显示。一旦TableView可编辑,数据就不会自动更新。在后一种情况下,您可以选择安装自定义提交处理程序或公开允许内部魔法工作的属性


不管怎么说,既然你已经有了它们,我看没有理由不(也没有理由不在教程中学习)

取决于你所说的“工作”是什么意思:-)

只要TableView是只读的,getter/setter就足够了:数据按预期显示。一旦TableView可编辑,数据就不会自动更新。在后一种情况下,您可以选择安装自定义提交处理程序或公开允许内部魔法工作的属性


不管怎样,既然您已经有了它们,我认为没有理由不(也不在教程中学习)

作为旁白,因为您使用的是Java 8,那么在这里使用lambda表达式要好得多:
idCol.setCellValueFactory(cellData->cellData.getValue().actorIdProperty())如果您有一个属性访问器方法,并且
idCol.setCellValueFactory(cellData->new ReadOnlyStringWrapper(cellData.getValue().getActorId())如果没有。最重要的是,使用这种方法可以让编译器检查该方法是否存在以及是否属于正确的类型,而且它的优点是速度更快,因为它不依赖于反射。另外,由于您使用的是Java 8,因此在这里使用lambda表达式要好得多:
idCol.setCellValueFactory(cellData->cellData.getValue().actorIdProperty());
如果您有属性访问器方法,以及
idCol.setCellValueFactory(cellData->new ReadOnlyStringWrapper(cellData.getValue().getActorId()))
如果不存在。使用这种方法可以让编译器检查该方法是否存在以及是否属于正确的类型,最重要的是,作为一个好处,它似乎更快,因为它不依赖于反射。该方法还说:“如果不存在与此模式匹配的方法,那么尝试调用get()或is()的支持就会失败。”,因此只使用JavaBean样式的方法是安全的。但是,在Java 8中,
PropertyValueFactory
基本上是多余的;使用lambda表达式来代替。我同意@James_D。使用lambda比PropertyValueFactory.AFAIK好得多,该字段应该被称为
actorId
,但也应该有一个名为
actorIdProperty
。还说:“如果不存在与此模式匹配的方法,则对尝试调用get()或is()的支持将失效。”,因此只使用JavaBean样式的方法是安全的。但是,在Java 8中,
PropertyValueFactory
基本上是多余的;使用lambda表达式来代替。我同意@James_D。使用lambda比PropertyValueFactory.AFAIK好得多,该字段应该被称为
actorId
,但也应该有一个名为
actorIdProperty