2012-02-17 10 views
3

を使用する方法:私はにTableViewBuilderを使用することが、成功せずにしようとしてきたのJavaFX 2.0 TableViewBuilderは、与えられたPersonクラスを

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(); 
    } 
} 

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; 
    } 
} 

私はテーブルビュー上のJavaFX APIの例を再作成しました同じテーブルを再作成します。誰でもJavaFX 2.0 TableViewBuilderを使用して既存のObservableListを持つTableViewを作成する方法を知っていますか?ここで

答えて

1

はサンプルです:

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は、それに供給されなければならない第2のジェネリック型パラメータとして再帰型を持っています。上記のコードは私が思いつくことのできる次善のものですが、データの定義がObservableList<?>で、データをビルダーのObservableList<Object>にキャストする必要があるという不思議なタイプがあります。

私はこの練習の後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プロジェクトをチェックアウトしてください。 。 。

+0

おかげで、コードの第二部分は、ソリューションです。私はAPIからそれを理解したことはありませんでした。 – Burabari

1

ここでのトリックは、createという名前の工場で作成されているため、ここでは名前空間ロールのみを再生するクラス名Builderではなく、パラメータ化する必要があります。

この方法:

TableViewBuilder.<Person>create().build(); 
関連する問題