2016-09-12 7 views
1

Я написал небольшое приложение, которое имеет TableView с с несколькими опциями фильтра. Это выглядит, как показано ниже:Javafx TableView с возможностью выбора нескольких фильтров

enter image description here

Ниже приведены параметры фильтров, представленных в заявке: Имя

  • Объект/Расположение - TextField (поиск таблицы)
  • Выпуск 5/6 Objects - - CheckBox (Release 5 Objects и Release 6 Objects)
  • Живые объекты - CheckBox (живые объекты)

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

, например. - Если я набираю слово «OBJ» в таблице поиска TextField, таблица будет содержать только строки, в которых имя или местоположение объекта содержит слово «OBJ». Теперь, если я выберу флажок Release 6 Objects, таблица проигнорирует фильтр «OBJ», упомянутый в текстовом поле Search Table, и отобразит все объекты, версия которых равна 6.

Что я пытаюсь сделать, так это то, что когда я выбираю объекты Release 6 CheckBox, таблица должна содержать только строки, в которых имя/местоположение объекта содержит «OBJ» и имеет версию как 6.

Аналогичным образом, я хочу использовать либо все критерии фильтра, либо комбинацию другого фильтра критерии. Кто-нибудь может мне с этим помочь?

+0

Я предлагаю вам проверить один фильтр в то время, например: сначала проверить, если выбран и фильтр Release 6 объектов данные, затем проверьте, выбраны ли объекты версии 5 и фильтруются данные, и так далее, пока все фильтры не будут проверены. – aleb2000

+0

Также вы можете добавить соответствующий вопрос к вопросу? – aleb2000

ответ

1

Наконец, после нескольких попыток, я нашел способ добиться этого.

Раньше я использовал местную SortedList и FilteredList переменных с ObservableList как данные табл. Теперь я использую переменную SortedList и FilteredList.

При чтении данных из файла, загружать данные в FilteredList, а затем создать новый глобальный SortedList используя FilteredList. Затем привяжите SortedList comparatorProperty с таблицей comparatorProperty и присвойте глобальному SortedList таблице.

Ниже приведен код, чтобы сделать выше

filteredObjects = new FilteredList<>(objects, p -> true); 
sortedObjects = new SortedList<>(filteredObjects); 
sortedObjects.comparatorProperty().bind(tblPrimeCodeList.comparatorProperty()); 
tblPrimeCodeList.setItems(sortedObjects); 

Затем для каждого поля фильтра добавить новый ChangeListener, где на основе значения каждого поля фильтра фильтра данные будут снова фильтруют. Ниже приведен код для фильтра TextField Таблица поиска.

txtFilter.textProperty().addListener((observable, oldValue, newValue) -> { 
filteredObjects.setPredicate(obj -> { 
    if (!chkRel5.isSelected() && !chkRel6.isSelected()) { 
     return false; 
    } 

    if (newValue == null || newValue.isEmpty()) { 
    } else { 
     String lowerCaseFilter = newValue.toLowerCase(); 
     if (obj.getName().toLowerCase().contains(lowerCaseFilter) || 
      obj.getLocation().toLowerCase().contains(lowerCaseFilter)) { 
     } else { 
      return false; 
     } 
    } 

    if (chkLiveObj.isSelected() && !obj.getLive()) { 
     return false; 
    } 

    if (!chkRel5.isSelected() && obj.getVersion() == 5) { 
     return false; 
    } 

    if (!chkRel6.isSelected() && obj.getVersion() == 6) { 
     return false; 
    } 

    return true; 
    }); 
}); 

Ниже приведен код для CheckBox Release 5 объектов

chkRel5.selectedProperty().addListener(new ChangeListener<Boolean>() { 

@Override 
public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) { 
filteredObjects.setPredicate(obj -> { 
    if (!chkRel5.isSelected() && obj.getVersion() == 5) { 
     return false; 
    } 

    if (!chkRel6.isSelected() && obj.getVersion() == 6) { 
     return false; 
    } 

    if (chkLiveObj.isSelected() && !obj.getLive()) { 
     return false; 
    } 

    if (txtFilter.getText().trim().length() > 0) { 
     String lowerCaseFilter = txtFilter.getText().trim().toLowerCase(); 
     if (obj.getName().toLowerCase().contains(lowerCaseFilter) || 
      obj.getLocation().toLowerCase().contains(lowerCaseFilter)) { 
     } else { 
      return false; 
     } 
    } 
    return true; 
    }); 
    sortedObjects = new SortedList<>(filteredObjects); 
    } 
});