controlfx TableFilter-dynamically adding rows are not getting filtered

398 views
Skip to first unread message

Arun viswanath

unread,
Jul 4, 2017, 7:42:07 AM7/4/17
to ControlsFX
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...@example.com"),
           
new Person("aaIsabella", "Johnson", "isabella...@example.com"),
           
new Person("aaEthan", "Williams", "ethan.w...@example.com"),
           
new Person("Emma", "Jones", "emma....@example.com"),
           
new Person("Michael", "Brown", "michae...@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...@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 + "]";
       
}

   
}
}

Message has been deleted

Shawn Muller

unread,
Jul 24, 2017, 7:52:41 AM7/24/17
to ControlsFX
Hi.  

I added the new records to tableFilter.getBackingList().  Worked for me.
Reply all
Reply to author
Forward
0 new messages