Меню с флажками для фильтрации Jtable в Java - PullRequest
0 голосов
/ 10 октября 2018

В моей программе у меня есть Jtable с элементами.Я хочу иметь возможность фильтровать эти элементы на основе значений (некоторые логические и некоторые строки).

Что я пробовал / сделал: Я сделал выпадающий список с элементами и флажком , где я могу выбрать из выпадающего списка, и программа фильтрует таблицу.Если выбран второй сорт (без лучшего имени), он будет фильтроваться дальше, иначе он будет фильтровать по «свежим данным», которые я извлекаю из базы данных и помещаю в JTable.

Что делает код : что я действительно хочу, так это меню / нечто симулированное во внешнем виде, где можно иметь флажки, содержащие подменю, где я могу проверить, что я хочу отфильтроватьна.Я сделал меню с подменю с помощью JCheckBoxMenuItem's.И я сделал ItemListeners, но я должен сделать слушатель для каждого, и я не знаю, как проверить, какие из них через меню, для каких значений я уже проверил.Поэтому я получаю только «свежий» список для Jtable или 1 фильтр.

Вопрос: Как включить несколько фильтров?и как мне сделать обычного слушателя, который будет фильтровать в зависимости от того, какой флажок я нажимаю в моем меню и те, которые были нажаты ранее?

_sortComboBox.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent arg0) {
            String value = _sortComboBox.getSelectedItem().toString();

            List<StakeholderRequirement> listToSort = new ArrayList<StakeholderRequirement>();

            if(_secondSortCheckBox.isSelected() == true) {
                for(int i = 0; i < _stakeholderRequirementTable.getRowCount(); i++) {
                    listToSort.add(_stakeholderRequirementListTableModel.getRequirementAt(i));                  
                }
            } else {
                listToSort = _project.getStakeholderRequirementList();
            }

            List<StakeholderRequirement> filteredList;

            switch (value) {
                case "All":
                    _stakeholderRequirementListTableModel.setStakeholderReqList(_project.getStakeholderRequirementList());
                    break;
                case "Accepted":
                    filteredList = listToSort.stream().filter(StakeholderRequirement -> StakeholderRequirement.isAccepted() == true).collect(Collectors.toList());
                    _stakeholderRequirementListTableModel.setStakeholderReqList(filteredList);
                    break;
                case "Approved":
                    filteredList = listToSort.stream().filter(StakeholderRequirement -> StakeholderRequirement.isApproved() == true).collect(Collectors.toList());
                    _stakeholderRequirementListTableModel.setStakeholderReqList(filteredList);
                    break;
                case "Specified":
                    filteredList = listToSort.stream().filter(StakeholderRequirement -> StakeholderRequirement.isSpecified() == true).collect(Collectors.toList());
                    _stakeholderRequirementListTableModel.setStakeholderReqList(filteredList);
                    break;
                case "Validated":
                    filteredList = listToSort.stream().filter(StakeholderRequirement -> StakeholderRequirement.isValidated() == true).collect(Collectors.toList());
                    _stakeholderRequirementListTableModel.setStakeholderReqList(filteredList);
                    break;
                case "Verified":
                    filteredList = listToSort.stream().filter(StakeholderRequirement -> StakeholderRequirement.isVerified() == true).collect(Collectors.toList());
                    _stakeholderRequirementListTableModel.setStakeholderReqList(filteredList);
                    break;
            }
            _stakeholderRequirementListTableModel.fireTableDataChanged();

        }

    });

.

JMenu _requirementIndicators = new JMenu("Status Indicators"); 
JCheckBoxMenuItem _RIAccepted = new JCheckBoxMenuItem("Accepted");
        _RIAccepted.addItemListener( new ItemListener() {
            @Override
            public void itemStateChanged(ItemEvent e) {

                List<StakeholderRequirement> listToSort = new ArrayList<StakeholderRequirement>();

                listToSort = _project.getStakeholderRequirementList();

                if(e.getStateChange()== 1) {
                    List<StakeholderRequirement> filteredList;

                    filteredList = listToSort.stream().filter(StakeholderRequirement -> StakeholderRequirement.isAccepted() == true).collect(Collectors.toList());
                    _stakeholderRequirementListTableModel.setStakeholderReqList(filteredList);

                } else {
                    _stakeholderRequirementListTableModel.setStakeholderReqList(listToSort);
                }

                _stakeholderRequirementListTableModel.fireTableDataChanged();


            }

        });

1 Ответ

0 голосов
/ 10 октября 2018

Прочтите раздел из учебника Swing по Сортировка и фильтрация для ознакомления с основами фильтрации.

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

В вашем случае пользователь выберет значение, а затем вы создадите фильтр, используя выбранное значение.

Как включить несколько фильтров?

//rf = RowFilter.regexFilter("^" + filterText.getText(), 0); // match from beginning
List<RowFilter<Object,Object>> filters = new ArrayList<RowFilter<Object,Object>>(2);
filters.add(RowFilter.regexFilter(filterText.getText(), 0));
filters.add(RowFilter.regexFilter(filterText.getText(), 1));
rf = RowFilter.andFilter(filters);

Выше показано, как изменить фильтр из учебника, чтобы проверить значение двух столбцов в таблице.Прочитайте RowFilter API.Вы можете использовать andFilter или orFilter в зависимости от ваших требований.

...