Как я могу отфильтровать данные табличного представления по нескольким текстовым полям, используя JavaFX? - PullRequest
0 голосов
/ 08 сентября 2018

Я сделал фильтрацию с помощью одного текстового поля. но я хочу отфильтровать табличное представление по нескольким полям. несколько полей похожи на текстовое поле, поле со списком и выбора даты.

@FXML
private void prop_socity_key(KeyEvent event)
{

    society_name.textProperty().addListener(( observable, oldValue, newValue)->
    {

        property_filter.setPredicate((Predicate<? super Search_field>)(Search_field s_f)->
        {


        if(newValue.isEmpty() || newValue == null)
        {
            return true;
        }
        else if(s_f.getprop_society().contains(newValue))
        {
            return true;
        }
        return false;
        });
    });

    SortedList sort = new SortedList(property_filter);
    sort.comparatorProperty().bind(Property_table.comparatorProperty());
    Property_table.setItems(sort);

}

1 Ответ

0 голосов
/ 08 сентября 2018

Используйте FilteredList и свяжите его predicate свойство с Predicate, которое зависит от входных данных:

private static <T> void replace(ObservableList<T> list, T oldItem, T newItem) {
    if (oldItem == null) {
        if (newItem != null) {
            list.add(newItem);
        }
    } else {
        int index = list.indexOf(oldItem);
        if (newItem == null) {
            if (index >= 0) {
                list.remove(index);
            }
        } else {
            if (index >= 0) {
                list.set(index, newItem);
            } else {
                list.add(newItem);
            }
        }
    }
}
ObservableList<Predicate<SearchField>> predicates = FXCollections.observableArrayList();
property_filter.predicateProperty().bind(Bindings.createObjectBinding(() -> predicates.isEmpty() ? null : new Predicate<SearchField>() {

    @Override
    public boolean test(SearchField item) {
         for (Predicate<SearchField> predicate : predicates) {
             if (!predicate.test(item)) {
                 return false;
             }
         }
         return true;
    }

}, predicates));

society_name.textProperty().addListener(new ChangeListener<String>() {

    private Predicate<SearchField> predicate;

    @Override
    public void changed(ObservableValue<? extends String> o, String oldValue, String newValue) {
        Predicate<SearchField> oldPredicate = predicate;
        predicate = newValue.isEmpty() ? null : i -> i.getprop_society().contains(newValue);
        replace(predicates, oldPredicate, predicate);
    }

});

comboBox.valueProperty().addListener(new ChangeListener<ItemType>() {

    private Predicate<SearchField> predicate;

    @Override
    public void changed(ObservableValue<? extends ItemType> o, ItemType oldValue, ItemType newValue) {
        Predicate<SearchField> oldPredicate = predicate;
        predicate = ...;
        replace(predicates, oldPredicate, predicate);
    }

});

...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...