controlfx TableFilter-动态添加行不会被过滤

时间:2017-07-04 10:47:52

标签: java javafx controlsfx

我正在使用controlfx TableFilter属性来实现javafx tableview的过滤器可用性。它工作正常。但是,一旦将过滤器应用于特定列,并且在动态添加新行时,该行不会被过滤。或者换句话说,列值会自动添加到该列的过滤器中。预期的行为是,添加的行也应按照定义的过滤器进行过滤。 PFA解决问题的示例代码

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 + "]";
        }

    }
}

1 个答案:

答案 0 :(得分: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();