给定Person类:

public class Person {
    private StringProperty firstName;
     private StringProperty lastName;

     public Person(String firstName, String lastName){
         setFirstName(firstName);
         setLastName(lastName);
     }

     //SETTERS
     public final void setFirstName(String value) { firstNameProperty().set(value); }
     public final void setLastName(String value) { lastNameProperty().set(value); }

     //GETTERS
     public String getFirstName() { return firstNameProperty().get(); }
     public String getLastName() { return lastNameProperty().get(); }

     //PROPERTY GETTERS
     public StringProperty firstNameProperty() {
         if (firstName == null) firstName = new SimpleStringProperty(this, "firstName");
         return firstName;
     }
     public StringProperty lastNameProperty() {
         if (lastName == null) lastName = new SimpleStringProperty(this, "lastName");
         return lastName;
     }
}

我在TableView上重新创建了JavaFX API示例:
public class TestTableViewBuilder extends Application {
    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) {
       primaryStage.setTitle("Hello World!");

       final ObservableList<Person> data = FXCollections.observableArrayList(
            new Person("Jacob", "Smith"),
            new Person("Isabella", "Johnson"),
            new Person("Ethan", "Williams"),
            new Person("Emma", "Jones"),
            new Person("Michael", "Brown")
        );

       TableView<Person> table = new TableView<Person>();

       table.setItems(data);

       TableColumn<Person,String> firstNameCol = new TableColumn<Person,String>("First Name");
       firstNameCol.setCellValueFactory(new PropertyValueFactory("firstName"));
       TableColumn<Person,String> lastNameCol = new TableColumn<Person,String>("Last Name");
       lastNameCol.setCellValueFactory(new PropertyValueFactory("lastName"));

       table.getColumns().setAll(firstNameCol, lastNameCol);

       Group root = new Group();
       root.getChildren().add(table);
       primaryStage.setScene(new Scene(root));
       primaryStage.show();
    }
}

我一直在尝试使用TableViewBuilder重新创建同一张表,但没有成功。有人知道如何使用JavaFX 2.0 TableViewBuilder创建具有现有ObservableList的TableView吗?

最佳答案

这是一个示例:

import javafx.application.Application;
import javafx.collections.*;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.stage.Stage;

public class TableViewBuilderExample extends Application {
  public static void main(String[] args) { launch(args); }
  @Override public void start(Stage stage) {
    final ObservableList<?> data = FXCollections.observableArrayList(
      new Person("Jacob", "Smith"),
      new Person("Isabella", "Johnson")
    );

    stage.setScene(
      new Scene(
        TableViewBuilder.create().items((ObservableList<Object>) data).columns(
          TableColumnBuilder.create().text("First Name").cellValueFactory(new PropertyValueFactory("firstName")).build(),
          TableColumnBuilder.create().text("Last Name").cellValueFactory(new PropertyValueFactory("lastName")).build()
        ).build()
      )
    );
    stage.show();
  }
}

构建器中的通用类型用法有一些奇怪的事情。我本来想说类似TableViewBuilder<Person>.create()的话,但是TableViewBuilder具有递归类型作为必须提供给它的第二个泛型类型参数,因此我无法使该策略起作用。上面的代码是我可以想到的第二件好事,但是它仍然带有一些奇怪的类型,即数据的ObservableList<?>定义,以及在Builder中将数据转换为ObservableList<Object>的需要。

基于Sergey对构建器的类型参数化语法的了解,我能够创建以下构建器,该构建器将与ObservableList<Person>的数据类型一起使用
TableViewBuilder.<Person>create().items(data).columns(
  TableColumnBuilder.<Person, String>create()
    .text("First Name").cellValueFactory(new PropertyValueFactory("firstName"))
  .build(),
  TableColumnBuilder.<Person, String>create()
    .text("Last Name").cellValueFactory(new PropertyValueFactory("lastName"))
  .build()
).build()

完成此练习后,如果我不得不做很多这类事情,我将更倾向于检出DataFX项目。 。 。

09-04 20:11