javafx api TableView

帅煌
2023-12-01
@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:

  • Powerful TableColumn API:

    1. Support for cell factories to easily customize cell contents in both rendering and editing states.
    2. Specification of minWidth/ prefWidth/maxWidth, and also fixed width columns.
    3. Width resizing by the user at runtime.
    4. Column reordering by the user at runtime.
    5. Built-in support for column nesting

  • Different resizing policies to dictate(指挥) what happens when the user resizes columns.
  • Support for multiple column sorting by clicking the column header (hold down Shift keyboard key whilst clicking on a header to sort by multiple columns).

Note that TableView is intended to be used for visualize data - it is not intended to be used for laying out your user interface. If you want to lay your user interface out in a grid-like fashion, consider the GridPane layout.
Creating a TableView
Creating a TableView is a multi-step process, and also depends on the underlying data model needing to be represented. For this example we'll use an ObservableList, as it is the simplest way of showing data in a TableView. The Person class will consist of a first name and last name properties. That is:
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.


At this point we now have a TableView hooked up to observe the teamMembers observableList. The missing ingredient(成分) now is the means of splitting out the data contained within the model and representing it in one or more TableColumn instances. To create a two-column TableView to show the firstName and lastName properties, we extend the last code sample as follows:
 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.


TableView support for classes that don't contain properties


The code shown above is the shortest possible code for creating a TableView when the domain objects are designed with JavaFX properties in mind (additionally, PropertyValueFactory supports normal JavaBean properties too, although there is a caveat(需要注意的) to this, so refer to the class documentation for more information). When this is not the case, it is necessary to provide a custom cell value factory. More information about cell value factories can be found in the TableColumn API documentation, but briefly, here is how a TableColumn could be specified:
 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
To track selection and focus, it is necessary to become familiar with the SelectionModel and FocusModel classes. A TableView has at most one instance of each of these classes, available from selectionModel and focusModel properties respectively. Whilst it is possible to use this API to set a new selection model, in most circumstances this is not necessary - the default selection and focus models should work in most circumstances.


The default SelectionModel used when instantiating a TableView is an implementation of the MultipleSelectionModel abstract class. However, as noted in the API documentation for the selectionMode property, the default value is SelectionMode.SINGLE. To enable multiple selection in a default TableView instance, it is therefore necessary to do the following:
 tableView.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
Customizing TableView Visuals
The visuals of the TableView can be entirely customized by replacing the default row factory. A row factory is used to generate TableRow instances, which are used to represent an entire row in the TableView.


In many cases, this is not what is desired however, as it is more commonly the case that cells be customized on a per-column basis, not a per-row basis. It is therefore important to note that a TableRow is not a TableCell. A TableRow is simply a container for zero or more TableCell, and in most circumstances it is more likely that you'll want to create custom TableCells, rather than TableRows. The primary use case for creating custom TableRow instances would most probably be to introduce some form of column spanning support.


You can create custom TableCell instances per column by assigning the appropriate function to the TableColumn cell factory property.


See the Cell class documentation for a more complete description of how to write custom Cells.


See Also:

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.



 类似资料:

相关阅读

相关文章

相关问答