SimpleStringProperty和SimpleIntegerProperty表视图JavaFX

SimpleStringProperty和SimpleIntegerProperty表视图JavaFX,java,tableview,javafx,Java,Tableview,Javafx,因此,我试图学习如何使用JavaFx Tableview,并在本教程中进行了详细介绍: 在本教程中,它们表明,为了填充tableView,您必须用字符串填充它,而不仅仅是任何字符串,您必须将String格式化为SimpleStringProperty 我尝试没有格式,结果是没有任何信息会显示 我还发现,如果要向表中添加整数,则必须将其声明为SimpleIntegerProperty 现在我对JavaFx相当陌生,但这是否意味着当我创建一个对象时,我必须格式化所有的整数和字符串才能填充我的Tab

因此,我试图学习如何使用JavaFx Tableview,并在本教程中进行了详细介绍:

在本教程中,它们表明,为了填充tableView,您必须用字符串填充它,而不仅仅是任何字符串,您必须将
String
格式化为
SimpleStringProperty

我尝试没有格式,结果是没有任何信息会显示

我还发现,如果要向表中添加
整数
,则必须将其声明为
SimpleIntegerProperty


现在我对JavaFx相当陌生,但这是否意味着当我创建一个对象时,我必须格式化所有的整数和字符串才能填充我的TableView?这似乎很愚蠢,但也许还有更高的目标?还是有办法避免呢

您不需要在表数据对象中使用属性来显示它们,尽管在某些情况下使用属性是可取的

下面的代码将根据仅包含字符串字段的Person类显示人员表

import javafx.application.Application;
import javafx.collections.*;
import javafx.geometry.Insets;
import javafx.scene.*;
import javafx.scene.control.*;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.layout.VBox;
import javafx.scene.text.Font;
import javafx.stage.Stage;

public class ReadOnlyTableView extends Application {
  private TableView<Person> table = new TableView<Person>();
  private final ObservableList<Person> data =
    FXCollections.observableArrayList(
      new Person("Jacob", "Smith", "jacob.smith@example.com"),
      new Person("Isabella", "Johnson", "isabella.johnson@example.com"),
      new Person("Ethan", "Williams", "ethan.williams@example.com"),
      new Person("Emma", "Jones", "emma.jones@example.com"),
      new Person("Michael", "Brown", "michael.brown@example.com")
    );

  public static void main(String[] args) { launch(args); }

  @Override public void start(Stage stage) {
    stage.setTitle("Table View Sample");
    stage.setWidth(450);
    stage.setHeight(500);

    final Label label = new Label("Address Book");
    label.setFont(new Font("Arial", 20));

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

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

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

    table.setItems(data);
    table.getColumns().addAll(firstNameCol, lastNameCol, emailCol);

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

    stage.setScene(new Scene(new Group(vbox)));
    stage.show();
  }

  public static class Person {
    private String firstName;
    private String lastName;
    private String email;

    private Person(String fName, String lName, String email) {
      this.firstName = fName;
      this.lastName = lName;
      this.email = email;
    }

    public String getFirstName() { return firstName; }
    public void setFirstName(String fName) { firstName = fName; }
    public String getLastName() { return lastName; }
    public void setLastName(String lName) { lastName = lName; }
    public String getEmail() { return email; }
    public void setEmail(String inMail) { email = inMail; }
  }
}
导入javafx.application.application;
导入javafx.collections.*;
导入javafx.geometry.Insets;
导入javafx.scene.*;
导入javafx.scene.control.*;
导入javafx.scene.control.cell.PropertyValueFactory;
导入javafx.scene.layout.VBox;
导入javafx.scene.text.Font;
导入javafx.stage.stage;
公共类ReadOnlyTableView扩展了应用程序{
private TableView table=new TableView();
私有最终可观测列表数据=
FXCollections.observableArrayList(
新人(“雅各布”、“史密斯”、“雅各布”。smith@example.com"),
新人(“伊莎贝拉”、“约翰逊”、“伊莎贝拉”。johnson@example.com"),
新人(“伊桑”、“威廉姆斯”、“伊桑”。williams@example.com"),
新人(“艾玛”、“琼斯”、“艾玛”。jones@example.com"),
新人(“迈克尔”、“布朗”、“迈克尔”。brown@example.com")
);
公共静态void main(字符串[]args){launch(args);}
@覆盖公共无效开始(阶段){
stage.setTitle(“表格视图示例”);
舞台布景宽度(450);
舞台设置高度(500);
最终标签=新标签(“地址簿”);
label.setFont(新字体(“Arial”,20));
TableColumn firstNameCol=新的TableColumn(“名字”);
firstNameCol.setMinWidth(100);
firstNameCol.setCellValueFactory(新属性ValueFactory(“firstName”));
TableColumn lastNameCol=新的TableColumn(“姓氏”);
lastNameCol.setMinWidth(100);
lastNameCol.setCellValueFactory(新属性ValueFactory(“lastName”));
TableColumn emailCol=新的TableColumn(“电子邮件”);
设置最小宽度(200);
emailCol.setCellValueFactory(新属性ValueFactory(“电子邮件”);
表2.设置项目(数据);
table.getColumns().addAll(firstNameCol、lastNameCol、emailCol);
最终VBox VBox=新的VBox();
vbox.setspace(5);
设置填充(新的插入(10,0,0,10));
vbox.getChildren().addAll(标签、表格);
舞台场景(新场景(新组)(vbox));
stage.show();
}
公共静态类人员{
私有字符串名;
私有字符串lastName;
私人字符串电子邮件;
私人(字符串fName、字符串lName、字符串电子邮件){
this.firstName=fName;
this.lastName=lName;
this.email=电子邮件;
}
公共字符串getFirstName(){return firstName;}
public void setFirstName(字符串fName){firstName=fName;}
公共字符串getLastName(){return lastName;}
public void setLastName(字符串lName){lastName=lName;}
公共字符串getEmail(){return email;}
public void setEmail(字符串inMail){email=inMail;}
}
}
解释

使用属性和ObservableList的目的是使它们是可列出的元素。使用属性时,如果数据模型中属性属性的值发生更改,则TableView中项目的视图将自动更新以匹配更新的数据模型值。例如,如果某人电子邮件属性的值设置为新值,则该更新将反映在TableView中,因为它侦听属性更改。相反,如果使用普通字符串表示电子邮件,则TableView不会刷新,因为它不知道电子邮件值的更改

文档详细描述了此过程:

如何使用此类的示例如下:

TableColumn<Person,String> firstNameCol = new TableColumn<Person,String>("First Name");
firstNameCol.setCellValueFactory(new PropertyValueFactory<Person,String>("firstName"));  
TableColumn firstNameCol=新的TableColumn(“名字”);
firstNameCol.setCellValueFactory(新属性ValueFactory(“firstName”));
在本例中,“firstName”字符串用作对 假定Person类类型中的firstNameProperty()方法(即 TableView项目列表的类类型)。此外,这种方法 必须返回属性实例。如果一个方法满足这些条件 找到需求后,TableCell将填充此 可观察的价值。此外,TableView将自动添加 返回值的观察器,以便触发任何更改 由TableView观察,导致单元格立即更新

如果不存在与此模式匹配的方法,则会出现故障 支持尝试调用get()或is()(即 是,getFirstName()或以上示例中的isFirstName()。如果是一种方法 如果存在与此模式匹配的,则此方法返回的值为 包装在ReadOnlyObjectWrapper中并返回到TableCell。 但是,在这种情况下,这意味着TableCell将不可用 能够观察ObservableValue的变化(如 第一种方法(见上文)

更新

这里是一个与第一个示例相反的示例,该示例演示了TableView如何根据对其ObservableList的更改以及对基于属性的item属性值的更改来观察和自动刷新

import javafx.application.Application;
import javafx.beans.property.*;
import javafx.collections.*;
import javafx.event.*;
import javafx.geometry.Insets;
import javafx.scene.*;
import javafx.scene.control.*;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.layout.VBox;
import javafx.scene.text.Font;
import javafx.stage.Stage;

public class PropertyBasedTableView extends Application {
  private TableView<Person> table = new TableView<Person>();
  private final ObservableList<Person> data = FXCollections.observableArrayList();
  private void initData() {
    data.setAll(
      new Person("Jacob", "Smith", "jacob.smith@example.com"),
      new Person("Isabella", "Johnson", "isabella.johnson@example.com"),
      new Person("Ethan", "Williams", "ethan.williams@example.com"),
      new Person("Emma", "Jones", "emma.jones@example.com"),
      new Person("Michael", "Brown", "michael.brown@example.com")
    );
  }

  public static void main(String[] args) { launch(args); }

  @Override public void start(Stage stage) {
    initData();

    stage.setTitle("Table View Sample");
    stage.setWidth(450);
    stage.setHeight(500);

    final Label label = new Label("Address Book");
    label.setFont(new Font("Arial", 20));

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

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

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

    table.setItems(data);
    table.getColumns().addAll(firstNameCol, lastNameCol, emailCol);
    table.setPrefHeight(300);

    final Button setEmailButton = new Button("Set first email in table to wizard@frobozz.com");
    setEmailButton.setOnAction(new EventHandler<ActionEvent>() {
      @Override public void handle(ActionEvent event) {
        if (data.size() > 0) {
          data.get(0).setEmail("wizard@frobozz.com");
        }  
      }
    });

    final Button removeRowButton = new Button("Remove first row from the table");
    removeRowButton.setOnAction(new EventHandler<ActionEvent>() {
      @Override public void handle(ActionEvent event) {
        if (data.size() > 0) {
          data.remove(0);
        }  
      }
    });

    final Button resetButton = new Button("Reset table data");
    resetButton.setOnAction(new EventHandler<ActionEvent>() {
      @Override public void handle(ActionEvent event) {
        initData();
      }
    });

    final VBox vbox = new VBox(10);
    vbox.setPadding(new Insets(10, 0, 0, 10));
    vbox.getChildren().addAll(label, table, setEmailButton, removeRowButton, resetButton);

    stage.setScene(new Scene(new Group(vbox)));
    stage.show();
  }

  public static class Person {
    private final StringProperty firstName;
    private final StringProperty lastName;
    private final StringProperty email;

    private Person(String fName, String lName, String email) {
      this.firstName = new SimpleStringProperty(fName);
      this.lastName = new SimpleStringProperty(lName);
      this.email = new SimpleStringProperty(email);
    }

    public String getFirstName() { return firstName.get(); }
    public void setFirstName(String fName) { firstName.set(fName); }
    public StringProperty firstNameProperty() { return firstName; }
    public String getLastName() { return lastName.get(); }
    public void setLastName(String lName) { lastName.set(lName); }
    public StringProperty lastNameProperty() { return lastName; }
    public String getEmail() { return email.get(); }
    public void setEmail(String inMail) { email.set(inMail); }
    public StringProperty emailProperty() { return email; }  // if this method is commented out then the tableview will not refresh when the email is set.
  }
}
导入javafx.application.application;
导入javafx.beans.property.*;
感应电动机