package net.thirdy.blackmarket.samples.table;
import java.util.Arrays;
import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.collections.transformation.FilteredList;
import javafx.collections.transformation.SortedList;
import javafx.fxml.FXML;
import javafx.scene.Scene;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.HBox;
import javafx.stage.Stage;
/**
* View-Controller for the person table.
*
* @author Marco Jakob
*/
public class PersonTableController extends Application {
@Override
public void start(Stage primaryStage) {
primaryStage.setTitle("Sorting and Filtering");
initialize();
AnchorPane.setBottomAnchor(personTable, 10.0);
AnchorPane.setLeftAnchor(personTable, 10.0);
AnchorPane.setRightAnchor(personTable, 10.0);
AnchorPane.setTopAnchor(personTable, 40.0);
HBox hBox = new HBox(filterField);
AnchorPane.setLeftAnchor(hBox, 10.0);
AnchorPane.setRightAnchor(hBox, 10.0);
AnchorPane.setTopAnchor(hBox, 10.0);
AnchorPane page = new AnchorPane(personTable, hBox);
Scene scene = new Scene(page);
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
private TextField filterField;
private TableView<Person> personTable;
private TableColumn<Person, String> firstNameColumn;
private TableColumn<Person, String> lastNameColumn;
private ObservableList<Person> masterData = FXCollections.observableArrayList();
/**
* Just add some sample data in the constructor.
*/
public PersonTableController() {
masterData.add(new Person("Hans", "Muster"));
masterData.add(new Person("Ruth", "Mueller"));
masterData.add(new Person("Heinz", "Kurz"));
masterData.add(new Person("Cornelia", "Meier"));
masterData.add(new Person("Werner", "Meyer"));
masterData.add(new Person("Lydia", "Kunz"));
masterData.add(new Person("Anna", "Best"));
masterData.add(new Person("Stefan", "Meier"));
masterData.add(new Person("Martin", "Mueller"));
}
private void initialize() {
// 0. Initialize the columns.
firstNameColumn = new TableColumn<>("First Name");
lastNameColumn = new TableColumn<>("Last Name");
firstNameColumn.setCellValueFactory(cellData -> cellData.getValue().firstNameProperty());
lastNameColumn.setCellValueFactory(cellData -> cellData.getValue().lastNameProperty());
// 1. Wrap the ObservableList in a FilteredList (initially display all data).
FilteredList<Person> filteredData = new FilteredList<>(masterData, p -> true);
// 2. Set the filter Predicate whenever the filter changes.
filterField = new TextField();
filterField.textProperty().addListener((observable, oldValue, newValue) -> {
filteredData.setPredicate(person -> {
// If filter text is empty, display all persons.
if (newValue == null || newValue.isEmpty()) {
return true;
}
// Compare first name and last name of every person with filter text.
String lowerCaseFilter = newValue.toLowerCase();
if (person.getFirstName().toLowerCase().contains(lowerCaseFilter)) {
return true; // Filter matches first name.
} else if (person.getLastName().toLowerCase().contains(lowerCaseFilter)) {
return true; // Filter matches last name.
}
return false; // Does not match.
});
});
personTable = new TableView<>();
personTable.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY);
personTable.getColumns().addAll(Arrays.asList(firstNameColumn, lastNameColumn));
// 3. Wrap the FilteredList in a SortedList.
SortedList<Person> sortedData = new SortedList<>(filteredData);
// 4. Bind the SortedList comparator to the TableView comparator.
sortedData.comparatorProperty().bind(personTable.comparatorProperty());
// 5. Add sorted (and filtered) data to the table.
personTable.setItems(sortedData);
}
}