Что вы могли бы сделать, это создать динамическую панель, которая будет расти по мере того, как пользователи добавят больше параметров поиска. По существу, у вас будет кнопка Add Search, которая будет добавлять новое поле со списком и текстовое поле при каждом нажатии (при условии, что последнее поле со списком в списке не пуст).
Вам нужно будет создать класс вида:
public class SearchTerm {
private int id;
private String column;
private String value;
//Getters and setters and the rest.
...
}
После того, что вы создаете поле со списком (который будет содержать все поля, которые пользователи могут осуществлять поиск через) и текстовое поле, которое будет содержать текст, вы можете добавить новый объект SearchTerm
в список условий поиска. Поле Id
пригодится, если вы хотите разрешить пользователям удалять и/или изменять существующие условия поиска.
Следующим шагом будет создание отдельного слоя, который по существу выполняет поиск. Это приведет к тому, что ваш уровень пользовательского интерфейса будет содержать функциональность пользовательского интерфейса. Шаблон единой ответственности диктует, что класс делает только одно. В настоящее время ваш класс отвечает за операции пользовательского интерфейса и базы данных.
Этот новый слой будет иметь метод, который принимает список из SearchTerm
элементов. Оттуда вы создадите свой поисковый запрос, выполнив итерацию по предоставленным объектам SearchTerm
и их соответствующим значениям. После этого вы можете вернуть список объектов User
, которые напоминают данные в вашей базе данных. Все это должно выполняться в отдельном потоке. Для этого вам понадобятся фоновые работники.
Некоторые дополнительные пункты:
Пожалуйста, убедитесь, что вы используете подготовленные заявления вместо SQL конкатенации. Кроме того, ваше приложение подвержено SQL-инъекции.
В настоящий момент вы выполняете операцию поиска в потоке Диспетчера событий (EDT). Это не рекомендуется, так как этот поток отвечает за поддержание пользовательского интерфейса. Таким образом, если вы выполняете интенсивные операции над этим потоком, пользовательский интерфейс будет страдать (становясь менее отзывчивым или простым замораживанием). Запуск операции поиска в отдельном потоке гарантирует, что EDT не будет увязнуть с не связанными с UI операциями. Затем вы можете обновить пользовательский интерфейс из фонового потока через механизм SwingUtilities.invokeLater
.
Пожалуйста, добавьте небольшое количество кода, чтобы показать свою проблему и в идеале, что вы пробовали. – npinti
ОК сделали, в рамках метода я просто хочу, чтобы иметь возможность искать несколько переменных и иметь возможность отправить его с помощью одного JButton. –