Class TableColumn<S,T>

java.lang.Object
javafx.scene.control.TableColumnBase<S,T>
javafx.scene.control.TableColumn<S,T>
Type Parameters:
S - The type of the TableView generic type (i.e. S == TableView<S>)
T - The type of the content in all cells in this TableColumn.
All Implemented Interfaces:
Styleable, EventTarget

public class TableColumn<S,T> extends TableColumnBase<S,T> implements EventTarget
A TableView is made up of a number of TableColumn instances. Each TableColumn in a table is responsible for displaying (and editing) the contents of that column. As well as being responsible for displaying and editing data for a single column, a TableColumn also contains the necessary properties to: When creating a TableColumn instance, perhaps the two most important properties to set are the column text (what to show in the column header area), and the column cell value factory (which is used to populate individual cells in the column). This can be achieved using some variation on the following code:
 
 ObservableList<Person> data = ...
 TableView<Person> tableView = new TableView<Person>(data);

 TableColumn<Person,String> firstNameCol = new TableColumn<Person,String>("First Name");
 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.getColumns().add(firstNameCol);}
This approach assumes that the object returned from p.getValue() has a JavaFX ObservableValue that can simply be returned. The benefit of this is that the TableView will internally create bindings to ensure that, should the returned ObservableValue change, the cell contents will be automatically refreshed.

In situations where a TableColumn must interact with classes created before JavaFX, or that generally do not wish to use JavaFX apis for properties, it is possible to wrap the returned value in a ReadOnlyObjectWrapper instance. For example:

 
 firstNameCol.setCellValueFactory(new Callback<CellDataFeatures<Person, String>, ObservableValue<String>>() {
     public ObservableValue<String> call(CellDataFeatures<Person, String> p) {
         return new ReadOnlyObjectWrapper(p.getValue().getFirstName());
     }
  });
It is hoped that over time there will be convenience cell value factories developed and made available to developers. As of the JavaFX 2.0 release, there is one such convenience class: PropertyValueFactory. This class removes the need to write the code above, instead relying on reflection to look up a given property from a String. Refer to the PropertyValueFactory class documentation for more information on how to use this with a TableColumn. Finally, for more detail on how to use TableColumn, there is further documentation in the TableView class documentation.
Since:
JavaFX 2.0
See Also:
  • Property Details

  • Field Details

    • DEFAULT_CELL_FACTORY

      public static final Callback<TableColumn<?,?>,TableCell<?,?>> DEFAULT_CELL_FACTORY
      If no cellFactory is specified on a TableColumn instance, then this one will be used by default. At present it simply renders the TableCell item property within the graphic property if the item is a Node, or it simply calls toString() if it is not null, setting the resulting string inside the text property.
  • Constructor Details

    • TableColumn

      public TableColumn()
      Creates a default TableColumn with default cell factory, comparator, and onEditCommit implementation.
    • TableColumn

      public TableColumn(String text)
      Creates a TableColumn with the text set to the provided string, with default cell factory, comparator, and onEditCommit implementation.
      Parameters:
      text - The string to show when the TableColumn is placed within the TableView.
  • Method Details

    • editAnyEvent

      public static <S, T> EventType<TableColumn.CellEditEvent<S,T>> editAnyEvent()
      Parent event for any TableColumn edit event.
      Type Parameters:
      S - The type of the TableView generic type
      T - The type of the content in all cells in this TableColumn
      Returns:
      The any TableColumn edit event
    • editStartEvent

      public static <S, T> EventType<TableColumn.CellEditEvent<S,T>> editStartEvent()
      Indicates that the user has performed some interaction to start an edit event, or alternatively the TableView.edit(int, javafx.scene.control.TableColumn) method has been called.
      Type Parameters:
      S - The type of the TableView generic type
      T - The type of the content in all cells in this TableColumn
      Returns:
      The start an edit event
    • editCancelEvent

      public static <S, T> EventType<TableColumn.CellEditEvent<S,T>> editCancelEvent()
      Indicates that the editing has been canceled, meaning that no change should be made to the backing data source.
      Type Parameters:
      S - The type of the TableView generic type
      T - The type of the content in all cells in this TableColumn
      Returns:
      The cancel an edit event
    • editCommitEvent

      public static <S, T> EventType<TableColumn.CellEditEvent<S,T>> editCommitEvent()
      Indicates that the editing has been committed by the user, meaning that a change should be made to the backing data source to reflect the new data.
      Type Parameters:
      S - The type of the TableView generic type
      T - The type of the content in all cells in this TableColumn
      Returns:
      The commit an edit event
    • tableViewProperty

      public final ReadOnlyObjectProperty<TableView<S>> tableViewProperty()
      The TableView that this TableColumn belongs to.
      See Also:
    • getTableView

      public final TableView<S> getTableView()
      Gets the value of the property tableView.
      Property description:
      The TableView that this TableColumn belongs to.
    • setCellValueFactory

      public final void setCellValueFactory(Callback<TableColumn.CellDataFeatures<S,T>,ObservableValue<T>> value)
      Sets the value of the property cellValueFactory.
      Property description:
      The cell value factory needs to be set to specify how to populate all cells within a single TableColumn. A cell value factory is a Callback that provides a TableColumn.CellDataFeatures instance, and expects an ObservableValue to be returned. The returned ObservableValue instance will be observed internally to allow for immediate updates to the value to be reflected on screen. An example of how to set a cell value factory is:
      
       lastNameCol.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().lastNameProperty();
           }
        });
       }
       
      A common approach is to want to populate cells in a TableColumn using a single value from a Java bean. To support this common scenario, there is the PropertyValueFactory class. Refer to this class for more information on how to use it, but briefly here is how the above use case could be simplified using the PropertyValueFactory class:
      
       lastNameCol.setCellValueFactory(new PropertyValueFactory<Person,String>("lastName"));
       
    • getCellValueFactory

      public final Callback<TableColumn.CellDataFeatures<S,T>,ObservableValue<T>> getCellValueFactory()
      Gets the value of the property cellValueFactory.
      Property description:
      The cell value factory needs to be set to specify how to populate all cells within a single TableColumn. A cell value factory is a Callback that provides a TableColumn.CellDataFeatures instance, and expects an ObservableValue to be returned. The returned ObservableValue instance will be observed internally to allow for immediate updates to the value to be reflected on screen. An example of how to set a cell value factory is:
      
       lastNameCol.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().lastNameProperty();
           }
        });
       }
       
      A common approach is to want to populate cells in a TableColumn using a single value from a Java bean. To support this common scenario, there is the PropertyValueFactory class. Refer to this class for more information on how to use it, but briefly here is how the above use case could be simplified using the PropertyValueFactory class:
      
       lastNameCol.setCellValueFactory(new PropertyValueFactory<Person,String>("lastName"));
       
    • cellValueFactoryProperty

      public final ObjectProperty<Callback<TableColumn.CellDataFeatures<S,T>,ObservableValue<T>>> cellValueFactoryProperty()
      The cell value factory needs to be set to specify how to populate all cells within a single TableColumn. A cell value factory is a Callback that provides a TableColumn.CellDataFeatures instance, and expects an ObservableValue to be returned. The returned ObservableValue instance will be observed internally to allow for immediate updates to the value to be reflected on screen. An example of how to set a cell value factory is:
      
       lastNameCol.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().lastNameProperty();
           }
        });
       }
       
      A common approach is to want to populate cells in a TableColumn using a single value from a Java bean. To support this common scenario, there is the PropertyValueFactory class. Refer to this class for more information on how to use it, but briefly here is how the above use case could be simplified using the PropertyValueFactory class:
      
       lastNameCol.setCellValueFactory(new PropertyValueFactory<Person,String>("lastName"));
       
      See Also:
    • setCellFactory

      public final void setCellFactory(Callback<TableColumn<S,T>,TableCell<S,T>> value)
      Sets the value of the property cellFactory.
      Property description:
      The cell factory for all cells in this column. The cell factory is responsible for rendering the data contained within each TableCell for a single table column.

      By default, TableColumn uses the default cell factory, but this can be replaced with a custom implementation, for example, to show data in a different way or to support editing. There is a lot of documentation on creating custom cell factories elsewhere (see Cell and TableView for example).

      Finally, there are a number of pre-built cell factories available in the javafx.scene.control.cell package.

    • getCellFactory

      public final Callback<TableColumn<S,T>,TableCell<S,T>> getCellFactory()
      Gets the value of the property cellFactory.
      Property description:
      The cell factory for all cells in this column. The cell factory is responsible for rendering the data contained within each TableCell for a single table column.

      By default, TableColumn uses the default cell factory, but this can be replaced with a custom implementation, for example, to show data in a different way or to support editing. There is a lot of documentation on creating custom cell factories elsewhere (see Cell and TableView for example).

      Finally, there are a number of pre-built cell factories available in the javafx.scene.control.cell package.

    • cellFactoryProperty

      public final ObjectProperty<Callback<TableColumn<S,T>,TableCell<S,T>>> cellFactoryProperty()
      The cell factory for all cells in this column. The cell factory is responsible for rendering the data contained within each TableCell for a single table column.

      By default, TableColumn uses the default cell factory, but this can be replaced with a custom implementation, for example, to show data in a different way or to support editing. There is a lot of documentation on creating custom cell factories elsewhere (see Cell and TableView for example).

      Finally, there are a number of pre-built cell factories available in the javafx.scene.control.cell package.

      See Also:
    • sortTypeProperty

      public final ObjectProperty<TableColumn.SortType> sortTypeProperty()
      Used to state whether this column, if it is part of a sort order (see TableView.getSortOrder() for more details), should be sorted in ascending or descending order. Simply toggling this property will result in the sort order changing in the TableView, assuming of course that this column is in the sortOrder ObservableList to begin with.
      See Also:
    • setSortType

      public final void setSortType(TableColumn.SortType value)
      Sets the value of the property sortType.
      Property description:
      Used to state whether this column, if it is part of a sort order (see TableView.getSortOrder() for more details), should be sorted in ascending or descending order. Simply toggling this property will result in the sort order changing in the TableView, assuming of course that this column is in the sortOrder ObservableList to begin with.
    • getSortType

      public final TableColumn.SortType getSortType()
      Gets the value of the property sortType.
      Property description:
      Used to state whether this column, if it is part of a sort order (see TableView.getSortOrder() for more details), should be sorted in ascending or descending order. Simply toggling this property will result in the sort order changing in the TableView, assuming of course that this column is in the sortOrder ObservableList to begin with.
    • setOnEditStart

      public final void setOnEditStart(EventHandler<TableColumn.CellEditEvent<S,T>> value)
      Sets the value of the property onEditStart.
      Property description:
      This event handler will be fired when the user successfully initiates editing.
    • getOnEditStart

      public final EventHandler<TableColumn.CellEditEvent<S,T>> getOnEditStart()
      Gets the value of the property onEditStart.
      Property description:
      This event handler will be fired when the user successfully initiates editing.
    • onEditStartProperty

      public final ObjectProperty<EventHandler<TableColumn.CellEditEvent<S,T>>> onEditStartProperty()
      This event handler will be fired when the user successfully initiates editing.
      See Also:
    • setOnEditCommit

      public final void setOnEditCommit(EventHandler<TableColumn.CellEditEvent<S,T>> value)
      Sets the value of the property onEditCommit.
      Property description:
      This event handler will be fired when the user successfully commits their editing.
    • getOnEditCommit

      public final EventHandler<TableColumn.CellEditEvent<S,T>> getOnEditCommit()
      Gets the value of the property onEditCommit.
      Property description:
      This event handler will be fired when the user successfully commits their editing.
    • onEditCommitProperty

      public final ObjectProperty<EventHandler<TableColumn.CellEditEvent<S,T>>> onEditCommitProperty()
      This event handler will be fired when the user successfully commits their editing.
      See Also:
    • setOnEditCancel

      public final void setOnEditCancel(EventHandler<TableColumn.CellEditEvent<S,T>> value)
      Sets the value of the property onEditCancel.
      Property description:
      This event handler will be fired when the user cancels editing a cell.
    • getOnEditCancel

      public final EventHandler<TableColumn.CellEditEvent<S,T>> getOnEditCancel()
      Gets the value of the property onEditCancel.
      Property description:
      This event handler will be fired when the user cancels editing a cell.
    • onEditCancelProperty

      public final ObjectProperty<EventHandler<TableColumn.CellEditEvent<S,T>>> onEditCancelProperty()
      This event handler will be fired when the user cancels editing a cell.
      See Also:
    • getColumns

      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.

      Specified by:
      getColumns in class TableColumnBase<S,T>
      Returns:
      An ObservableList containing TableColumnBase instances (or subclasses) that are the children of this TableColumnBase. If these children TableColumnBase instances are set as visible, they will appear beneath this table column.
    • getCellObservableValue

      public final ObservableValue<T> getCellObservableValue(int index)
      Attempts to return an ObservableValue<T> for the item in the given index (which is of type S). In other words, this method expects to receive an integer value that is greater than or equal to zero, and less than the size of the underlying data model. If the index is valid, this method will return an ObservableValue<T> for this specific column.

      This is achieved by calling the cell value factory, and returning whatever it returns when passed a CellDataFeatures (see, for example, the CellDataFeatures classes belonging to TableColumn and TreeTableColumn for more information).

      Specified by:
      getCellObservableValue in class TableColumnBase<S,T>
      Parameters:
      index - The index of the item (of type S) for which an ObservableValue<T> is sought.
      Returns:
      An ObservableValue<T> for this specific table column.
    • getCellObservableValue

      public final ObservableValue<T> getCellObservableValue(S item)
      Attempts to return an ObservableValue<T> for the given item (which is of type S). In other words, this method expects to receive an object from the underlying data model for the entire 'row' in the table, and it must return an ObservableValue<T> for the value in this specific column.

      This is achieved by calling the cell value factory, and returning whatever it returns when passed a CellDataFeatures (see, for example, the CellDataFeatures classes belonging to TableColumn and TreeTableColumn for more information).

      Specified by:
      getCellObservableValue in class TableColumnBase<S,T>
      Parameters:
      item - The item (of type S) for which an ObservableValue<T> is sought.
      Returns:
      An ObservableValue<T> for this specific table column.
    • getTypeSelector

      public String getTypeSelector()
      The type of this Styleable that is to be used in selector matching. This is analogous to an "element" in HTML. (CSS Type Selector).
      Specified by:
      getTypeSelector in interface Styleable
      Returns:
      "TableColumn"
      Since:
      JavaFX 8.0
    • getStyleableParent

      public Styleable getStyleableParent()
      Return the parent of this Styleable, or null if there is no parent.
      Specified by:
      getStyleableParent in interface Styleable
      Returns:
      getTableView()
      Since:
      JavaFX 8.0
    • getCssMetaData

      public List<CssMetaData<? extends Styleable,?>> getCssMetaData()
      The CssMetaData of this Styleable. This may be returned as an unmodifiable list.
      Specified by:
      getCssMetaData in interface Styleable
      Returns:
      the CssMetaData
      Since:
      JavaFX 8.0
    • getClassCssMetaData

      public static List<CssMetaData<? extends Styleable,?>> getClassCssMetaData()
      Gets the CssMetaData associated with this class, which may include the CssMetaData of its superclasses.
      Returns:
      the CssMetaData
      Since:
      JavaFX 8.0