diff options
Diffstat (limited to 'src/ch')
| -rw-r--r-- | src/ch/makery/sortfilter/Main.java | 36 | ||||
| -rw-r--r-- | src/ch/makery/sortfilter/Person.java | 44 | ||||
| -rw-r--r-- | src/ch/makery/sortfilter/PersonTable.fxml | 25 | ||||
| -rw-r--r-- | src/ch/makery/sortfilter/PersonTableController.java | 91 |
4 files changed, 196 insertions, 0 deletions
diff --git a/src/ch/makery/sortfilter/Main.java b/src/ch/makery/sortfilter/Main.java new file mode 100644 index 0000000..6a8f562 --- /dev/null +++ b/src/ch/makery/sortfilter/Main.java @@ -0,0 +1,36 @@ +package ch.makery.sortfilter; + +import java.io.IOException; + +import javafx.application.Application; +import javafx.fxml.FXMLLoader; +import javafx.scene.Scene; +import javafx.scene.layout.AnchorPane; +import javafx.stage.Stage; + +/** + * Main class to start the application. + * + * @author Marco Jakob + */ +public class Main extends Application { + + @Override + public void start(Stage primaryStage) { + primaryStage.setTitle("Sorting and Filtering"); + + try { + FXMLLoader loader = new FXMLLoader(Main.class.getResource("PersonTable.fxml")); + AnchorPane page = (AnchorPane) loader.load(); + Scene scene = new Scene(page); + primaryStage.setScene(scene); + primaryStage.show(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public static void main(String[] args) { + launch(args); + } +}
\ No newline at end of file diff --git a/src/ch/makery/sortfilter/Person.java b/src/ch/makery/sortfilter/Person.java new file mode 100644 index 0000000..af6f212 --- /dev/null +++ b/src/ch/makery/sortfilter/Person.java @@ -0,0 +1,44 @@ +package ch.makery.sortfilter; + +import javafx.beans.property.SimpleStringProperty; +import javafx.beans.property.StringProperty; + +/** + * Simple model class for the person table. + * + * @author Marco Jakob + */ +public class Person { + + private final StringProperty firstName; + private final StringProperty lastName; + + public Person(String firstName, String lastName) { + this.firstName = new SimpleStringProperty(firstName); + this.lastName = new SimpleStringProperty(lastName); + } + + public String getFirstName() { + return firstName.get(); + } + + public void setFirstName(String firstName) { + this.firstName.set(firstName); + } + + public StringProperty firstNameProperty() { + return firstName; + } + + public String getLastName() { + return lastName.get(); + } + + public void setLastName(String lastName) { + this.lastName.set(lastName); + } + + public StringProperty lastNameProperty() { + return lastName; + } +}
\ No newline at end of file diff --git a/src/ch/makery/sortfilter/PersonTable.fxml b/src/ch/makery/sortfilter/PersonTable.fxml new file mode 100644 index 0000000..aeb41b0 --- /dev/null +++ b/src/ch/makery/sortfilter/PersonTable.fxml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<?import java.lang.*?> +<?import javafx.scene.control.*?> +<?import javafx.scene.layout.*?> + +<AnchorPane minWidth="315.0" prefHeight="300.0" prefWidth="315.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="ch.makery.sortfilter.PersonTableController"> + <children> + <TableView fx:id="personTable" prefHeight="-1.0" prefWidth="-1.0" tableMenuButtonVisible="false" AnchorPane.bottomAnchor="10.0" AnchorPane.leftAnchor="10.0" AnchorPane.rightAnchor="10.0" AnchorPane.topAnchor="40.0"> + <columns> + <TableColumn fx:id="firstNameColumn" maxWidth="5000.0" minWidth="10.0" prefWidth="120.0" text="First Name" /> + <TableColumn fx:id="lastNameColumn" maxWidth="5000.0" minWidth="10.0" prefWidth="120.0" text="Last Name" /> + </columns> +<columnResizePolicy> +<TableView fx:constant="CONSTRAINED_RESIZE_POLICY" /> +</columnResizePolicy> + </TableView> + <HBox id="HBox" alignment="CENTER" spacing="5.0" AnchorPane.leftAnchor="10.0" AnchorPane.rightAnchor="10.0" AnchorPane.topAnchor="10.0"> + <children> + <Label text="Filter Table:" /> + <TextField fx:id="filterField" prefWidth="-1.0" HBox.hgrow="ALWAYS" /> + </children> + </HBox> + </children> +</AnchorPane> diff --git a/src/ch/makery/sortfilter/PersonTableController.java b/src/ch/makery/sortfilter/PersonTableController.java new file mode 100644 index 0000000..98ad591 --- /dev/null +++ b/src/ch/makery/sortfilter/PersonTableController.java @@ -0,0 +1,91 @@ +package ch.makery.sortfilter; + +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.control.TableColumn; +import javafx.scene.control.TableView; +import javafx.scene.control.TextField; + + +/** + * View-Controller for the person table. + * + * @author Marco Jakob + */ +public class PersonTableController { + + @FXML + private TextField filterField; + @FXML + private TableView<Person> personTable; + @FXML + private TableColumn<Person, String> firstNameColumn; + @FXML + 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")); + } + + /** + * Initializes the controller class. This method is automatically called + * after the fxml file has been loaded. + * + * Initializes the table columns and sets up sorting and filtering. + */ + @FXML + private void initialize() { + // 0. Initialize the columns. + 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.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().indexOf(lowerCaseFilter) != -1) { + return true; // Filter matches first name. + } else if (person.getLastName().toLowerCase().indexOf(lowerCaseFilter) != -1) { + return true; // Filter matches last name. + } + return false; // Does not match. + }); + }); + + // 3. Wrap the FilteredList in a SortedList. + SortedList<Person> sortedData = new SortedList<>(filteredData); + + // 4. Bind the SortedList comparator to the TableView comparator. + // Otherwise, sorting the TableView would have no effect. + sortedData.comparatorProperty().bind(personTable.comparatorProperty()); + + // 5. Add sorted (and filtered) data to the table. + personTable.setItems(sortedData); + } +} |
