给定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项目。 。 。