JTable - Фильтр данных

Я пытаюсь отфильтровать JTable, но результаты не такие, как ожидалось.

Ниже представлена ​​таблица JTable с добавленными элементами (я использую MySQL для хранения данных)

JTable с содержимым - Изображение

Когда я пытаюсь отфильтровать список по конкретному человеку, я не получаю данные из таблицы. Например, я ищу «Ана», но ничего не появляется.

Результаты поиска по запросу "Ана" - Изображение

Если я попытаюсь выполнить поиск по некоторым «числам», например по зарплате, я получу правильный результат, но идентификатор будет неправильным. Картинки для прояснения вопроса ниже.

Неверный ID
Правильный идентификатор

Код для создания ArrayList с сотрудниками:

public static ArrayList<Angajat> listaAngajati() {
        ArrayList<Angajat> listaAngajati = new ArrayList<>();
        try (java.sql.Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/angajati", "root", "***");) {

            Statement st = conn.createStatement();
            st.executeQuery("select * from angajati");
            ResultSet rs = st.getResultSet();
            Angajat angajat;
            while (rs.next()) {
                angajat = new Angajat(rs.getInt("id"), rs.getString("nume"), rs.getString("prenume"), rs.getInt("varsta"), rs.getString("adresa"), rs.getDouble("salariu"));
                listaAngajati.add(angajat);
            }

        } catch (SQLException ex) {
            System.out.println("Error in database connection: \n" + ex.getMessage());
        }
        return listaAngajati;
    }

    public static void arataAngajati() {
        ArrayList<Angajat> arataAngajati = listaAngajati();
        DefaultTableModel model = (DefaultTableModel) tabelangajati.getModel();
        Object[] rand = new Object[6];
        for (int i = 0; i < arataAngajati.size(); i++) {
            rand[0] = arataAngajati.get(i).getID();
            rand[1] = arataAngajati.get(i).getNume();
            rand[2] = arataAngajati.get(i).getPrenume();
            rand[3] = arataAngajati.get(i).getVarsta();
            rand[4] = arataAngajati.get(i).getAdresa();
            rand[5] = arataAngajati.get(i).getSalariu();
            model.addRow(rand);

        }

    }

Код для фильтрации JTable

private void cautaInTabelKeyReleased(java.awt.event.KeyEvent evt) {                                         
        DefaultTableModel tabel = (DefaultTableModel) tabelangajati.getModel();
        String query = cautaInTabel.getText().toLowerCase();
        TableRowSorter<DefaultTableModel> sort = new TableRowSorter<DefaultTableModel>(tabel);
        tabelangajati.setRowSorter(sort);

        sort.setRowFilter(RowFilter.regexFilter(query));

    }   

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

РЕДАКТИРОВАТЬ

Чтобы соответствующим образом отфильтровать данные из таблицы, мне пришлось использовать

sort.setRowFilter(RowFilter.regexFilter("(?i)" + query));

Когда я фильтровал таблицу, изменилось только представление, а не значения из строки (даже если я видел значения из строки 3 и значения в бэкэнде, откуда из строки 1). Мне удалось изменить следующую строку, и таблица работает отлично.

Из :

int row = tabelangajati.getSelectedRow();

К :

int row = tabelangajati.convertRowIndexToModel(tabelangajati.getSelectedRow());

Предоставьте минимальный воспроизводимый пример, чтобы мы также могли воспроизвести вашу проблему и отладить ваш код. Пожалуйста, не публикуйте полный код, а создайте небольшой исполняемый класс, который воспроизводит вашу проблему.

Sergiy Medvynskyy 09.08.2018 14:00

Прочтите руководство по Swing на Сортировка и фильтрация для рабочего примера. Я предполагаю, что вы неправильно строите regexFilter. Кажется, вы задаете запрос для символов нижнего регистра, но ваши данные содержат символы верхнего регистра, поэтому совпадений у вас никогда не будет.

camickr 11.08.2018 03:28

У вас есть проблема, когда вы добавляете в модель один и тот же массив объектов на каждой итерации. Переместите оператор Object[] rand = new Object[6]; внутрь цикла for. Кроме того, просто сделайте нам минимальный воспроизводимый пример, как уже указывалось. Трудно понять, в чем на самом деле ваша проблема с фрагментами, которые мы видим.

TT. 18.08.2018 16:57
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
3
52
0

Другие вопросы по теме