JavaFX 2.0 TableViewBuilder,如何使用

标签 java javafx-2

给定一个 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();
  }
}

Builders 中的通用类型使用发生了一些奇怪的事情。我本来想说类似 TableViewBuilder<Person>.create() 的东西,但是TableViewBuilder有一个递归类型作为必须提供给它的第二个泛型类型参数,所以我无法使该策略起作用。上面的代码是我能想出的下一个最好的东西,但它仍然有一些奇怪的输入与 ObservableList<?> 一起进行。数据的定义以及将数据转换为 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如果我不得不经常做这类事情,那就是项目。 . .

关于JavaFX 2.0 TableViewBuilder,如何使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9322187/

相关文章:

java - 查找具有多个 ID 属性的域对象?

java - 从输入流在 JavaFx 中播放 mp3 文件

javafx-2 - javafx 后台任务未运行多次

java - 一首接一首地播放 javafx

java - 按标点符号保存分割

java - 无论如何要获取构建 .class 文件时使用的编译标志吗?

java - Java中的注解为什么要创建类类型引用?

java - 向后显示字符串

javafx-2 - JavaFX 2.x : XYChart properties

javafx-2 - 使用 java 6 部署 javafx