2012-02-17 50 views
3

給定一個Person類:的JavaFX 2.0 TableViewBuilder,如何使用

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?

回答

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有一個遞歸類型作爲第二個必須提供給它的泛型類型參數,所以我無法讓這個策略工作。上面的代碼是我可以想到的下一個最好的東西,但它仍然有一些奇怪的輸入與數據的ObservableList<?>定義,並需要在Builder中將數據轉換爲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 2012-02-17 15:05:25

1

這裏的竅門是在Builders被命名爲create工廠創建的事實,所以你必須參數化他們,而不是Builder類名稱本身,只有在這裏扮演的命名空間的作用。

這樣:

TableViewBuilder.<Person>create().build();