XTableView

XTableView extends the regular TableView class and supports an optional, embedded filter header row. The corner button provides a popup to modify visibility of each column and the filter row as well. The clear button of the filter row clears out all filter inputs at once.

ObservableList persons = createItems();
// enable filter support
FilteredList filtered = new FilteredList(persons);
// data should be sortable too
SortedList sorted = new SortedList(filtered);

XTableView table = new XTableView<>(sorted);
sorted.comparatorProperty().bind(table.comparatorProperty());
table.setEditable(true);
    
XTableColumn first = new XTableColumn<>("First Name");
table.getColumns().addAll(first);
first.setCellValueFactory(new PropertyValueFactory<>("firstName"));
first.setCellFactory(TextFieldTableCell.forTableColumn());
first.setColumnFilter(new PatternColumnFilter<>());
...
XTableColumn last = new XTableColumn("LastName");
table.getColumns().addAll(last);    
last.setCellValueFactory(new PropertyValueFactory<>("lastName"));
last.setColumnFilter(new PatternColumnFilter<>());
...
XTableColumn emailHeader = new XTableColumn("Emails");
table.getColumns().addAll(emailHeader);
    
XTableColumn email = new XTableColumn("Primary");
XTableColumn secondary = new XTableColumn("Secondary");    
emailHeader.getColumns().addAll(email, secondary);
    
email.setCellValueFactory(new PropertyValueFactory<>("email"));
email.setColumnFilter(new PatternColumnFilter());
secondary.setCellValueFactory(new PropertyValueFactory<>("secondaryMail"));
secondary.setColumnFilter(new PatternColumnFilter()); 
...

The screenshot was taken from XTableViewDemo which can be downloaded from the link below.

See also

Download XTableView Demo
Filter Match Rules
CSS Reference - XTableView