Я пытаюсь отфильтровать 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());
Прочтите руководство по Swing на Сортировка и фильтрация для рабочего примера. Я предполагаю, что вы неправильно строите regexFilter. Кажется, вы задаете запрос для символов нижнего регистра, но ваши данные содержат символы верхнего регистра, поэтому совпадений у вас никогда не будет.
У вас есть проблема, когда вы добавляете в модель один и тот же массив объектов на каждой итерации. Переместите оператор Object[] rand = new Object[6]; внутрь цикла for. Кроме того, просто сделайте нам минимальный воспроизводимый пример, как уже указывалось. Трудно понять, в чем на самом деле ваша проблема с фрагментами, которые мы видим.




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