2

I am using controlfx TableFilter property for implementing filter cabability to javafx tableview. It works fine. But once have applied a filter to a particular column and when a new row is added dynamically that row is not filtered. Or in other words the column value is automatically added to that column's filter. Expected behaviour is that the rows getting added should also be filterd as per the defined filter. PFA the sample code that demostrates the problem

import org.controlsfx.control.table.TableFilter;
import org.controlsfx.control.table.TableFilter.Builder;
import javafx.application.Application;
import javafx.beans.property.SimpleStringProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.geometry.Insets;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.layout.VBox;
import javafx.scene.text.Font;
import javafx.stage.Stage;

public class TableViewSample extends Application {

    private TableView<Person> table = new TableView<Person>();
    private final ObservableList<Person> data = FXCollections.observableArrayList(
            new Person("aaJacob", "Smith", "jacob.smith@example.com"),
            new Person("aaIsabella", "Johnson", "isabella.johnson@example.com"),
            new Person("aaEthan", "Williams", "ethan.williams@example.com"),
            new Person("Emma", "Jones", "emma.jones@example.com"),
            new Person("Michael", "Brown", "michael.brown@example.com"));

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage stage) {

        Scene scene = new Scene(new Group());
        stage.setTitle("Table View Sample");
        stage.setWidth(450);
        stage.setHeight(500);

        final Label label = new Label("Address Book");
        label.setFont(new Font("Arial", 20));

        table.setEditable(true);

        TableColumn firstNameCol = new TableColumn("First Name");
        firstNameCol.setMinWidth(100);
        firstNameCol.setCellValueFactory(new PropertyValueFactory<Person, String>("firstName"));

        TableColumn lastNameCol = new TableColumn("Last Name");
        lastNameCol.setMinWidth(100);
        lastNameCol.setCellValueFactory(new PropertyValueFactory<Person, String>("lastName"));

        TableColumn emailCol = new TableColumn("Email");
        emailCol.setMinWidth(200);
        emailCol.setCellValueFactory(new PropertyValueFactory<Person, String>("email"));

        table.setItems(data);
        table.getColumns().addAll(firstNameCol, lastNameCol, emailCol);

        Builder<Person> builder = TableFilter.forTableView(this.table);
        builder.apply();

        Button button = new Button("Add Row");
        button.setOnAction((event) -> {
            Person person = new Person("Jacob", "Smith", "jacob.smith@example.com");
            System.out.println("Data is :" + data);
            data.add(person);
        });

        final VBox vbox = new VBox();
        vbox.setSpacing(5);
        vbox.setPadding(new Insets(10, 0, 0, 10));
        vbox.getChildren().addAll(label, table, button);

        ((Group) scene.getRoot()).getChildren().addAll(vbox);

        stage.setScene(scene);
        stage.show();
    }

    public static class Person {

        private final SimpleStringProperty firstName;
        private final SimpleStringProperty lastName;
        private final SimpleStringProperty email;

        private Person(String fName, String lName, String email) {
            this.firstName = new SimpleStringProperty(fName);
            this.lastName = new SimpleStringProperty(lName);
            this.email = new SimpleStringProperty(email);
        }

        public String getFirstName() {
            return firstName.get();
        }

        public void setFirstName(String fName) {
            firstName.set(fName);
        }

        public String getLastName() {
            return lastName.get();
        }

        public void setLastName(String fName) {
            lastName.set(fName);
        }

        public String getEmail() {
            return email.get();
        }

        public void setEmail(String fName) {
            email.set(fName);
        }

        @Override
        public String toString() {
            return "Person [firstName=" + firstName + ", lastName=" + lastName + ", email=" + email + "]";
        }

    }
}
ItachiUchiha
  • 36,135
  • 10
  • 122
  • 176
  • in the first column, apply the filter "Emma" and then add rows using add row button in the bottom. Ideally new row shouldn't show up since "Emma" is the set filter. But instead the newly added row is getting the the filter list. – Arun Viswanathan Jul 04 '17 at 11:14

1 Answers1

0

I had the same problem. Perhaps there is some kind of bug in TableFilter by controlsfx. I got the solution by creating my tableview programmatically. Filter should applied after adding all TableColumns in the TableView.If you create table view programmatically then you are free to add columns dynamically.

Do not apply filters on TableColumns. instead of this, apply filter on TableView.

TableFilter.forTableView(my_table_view).apply();

Anshu kumar
  • 407
  • 5
  • 5