JavaFX 2.0 TableViewBuilder, как использовать - PullRequest
3 голосов
/ 17 февраля 2012

Данный класс 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; 
     } 
}

Я заново создал пример API JavaFX для TableView:

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 для создания TableView с существующим ObservableList?

Ответы [ 2 ]

1 голос
/ 17 февраля 2012

Хитрость в том, что Builders создаются фабриками с именем create, поэтому вы должны параметризовать их, а не само имя класса Builder, которое здесь играет роль пространства имен.

Таким образом:

TableViewBuilder.<Person>create().build();
1 голос
/ 17 февраля 2012

Вот пример:

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> в Builder.

Основываясь на понимании Сергеем синтаксиса параметризации типов для компоновщиков, я смог создать следующий компоновщик, который будет работать с типом данных 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 , если бы мне пришлось много заниматься этим.,.

...