@DefaultProperty(value="items")
public class TableView<S>
extends Control
The TableView control is designed to visualize(可视化) an unlimited number of rows of data, broken out into columns. A TableView is therefore very similar to the ListView control, with the addition of support for columns. For an example on how to create a TableView, refer to the 'Creating a TableView' control section(部分) below.
The TableView control has a number of features, including:
package api.tableview;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
public class Person {
private StringProperty firstName;
public void setFirstName(String value) {
firstNameProperty().set(value);
}
public String getFirstName() {
return firstNameProperty().get();
}
public StringProperty firstNameProperty() {
if (firstName == null)
firstName = new SimpleStringProperty(this, "firstName");
return firstName;
}
private StringProperty lastName;
public void setLastName(String value) {
lastNameProperty().set(value);
}
public String getLastName() {
return lastNameProperty().get();
}
public StringProperty lastNameProperty() {
if (lastName == null)
lastName = new SimpleStringProperty(this, "lastName");
return lastName;
}
}
Firstly, a TableView instance needs to be defined, as such:
TableView<Person> table = new TableView<Person>();
With the basic table defined, we next focus on the data model. As mentioned, for this example, we'll be using a ObservableList. We can immediately set such a list directly in to the TableView, as such:
ObservableList<Person> teamMembers = getTeamMembers();
table.setItems(teamMembers);
With the items set as such, TableView will automatically update whenever the teamMembers list changes. If the items list is available before the TableView is instantiated, it is possible to pass it directly into the constructor.
ObservableList<Person> teamMembers = ...;
table.setItems(teamMembers);
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);
With the code shown above we have fully defined the minimum properties required to create a TableView instance. Running this code (assuming the people ObservableList is appropriately created) will result in a TableView being shown with two columns for firstName and lastName. Any other properties of the Person class will not be shown, as no TableColumns are defined.
firstNameCol.setCellValueFactory(new Callback<CellDataFeatures<Person, String>, ObservableValue<String>>() {
public ObservableValue<String> call(CellDataFeatures<Person, String> p) {
// p.getValue() returns the Person instance for a particular TableView row
return p.getValue().firstNameProperty();
}
});
}
TableView Selection / Focus APIs
tableView.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
Customizing TableView Visuals
TableColumn, TablePosition
方法:
public final ObservableList<TableColumn<S,?>> getColumns()
This enables(使) support for nested columns, which can be useful to group together related data. For example, we may have a 'Name' column with two nested columns for 'First' and 'Last' names.
This has no impact on the table as such - all column indices(指数) point to the leaf columns only, and it isn't possible to sort using the parent column, just the leaf columns. In other words, this is purely(纯粹) a visual feature.
Modifying the order or contents of this ObservableList will result in the viewColumns ObservableList being reset to equal this ObservableList.
Returns:
An ObservableList containing TableColumn instances that are the children of this TableColumn. If these children TableColumn instances are set as visible, they will appear beneath(下面) this TableColumn.