Как обнулить List вывод которого реализуется в JTextArea JAVA
столкнулся с проблемой! List нужно выводить после нажатия кнопки в TextArea. Лист формируется в зависимости от выбранных RadioButton. Повторно нажимая кнопку, сообщение не удаляется, а просто увеличивается. более подробное описание ниже:
Есть программа по поиску в которой присутствуют JRadioButtons, JTextArea и кнопка JButton после нажатия которой в JTextArea, выводится List который фильтрует другой лист с неким объемом элементов (замена БД). в зависимости от выбранных JRadioButtons (параметров для поиcка list) фильтры меняются.
Проблема в том, что после нажатия JButton, результат в JTextArea удовлетворяет первый раз, а потом например если ещё раз нажать, то результат просто добавляется к прошлому и при повторном нажатии ещё раз добавляется. А Если поменять параметры поиска, то просто то, что накопилось, заменяется на другие элементы + добавится ещё 1, а количество добавленного сохраняется. (видно на скринах ниже).
Поиск реализован созданием нового List который фильтрует по определённым характеристикам другой List. Я понимаю так, что каждый раз создается новый List (выделяется память для него) и по этому он растёт. Но как остановить это, что бы он каждый раз после нажатия обнулялся ?
Т.е. Как сделать так, чтобы в JTextArea после нажатия JButton "Начать поиск арматуры" не добавлялся результат поиска к прошлому результату, а был как после 1го нажатия JButton, а не увеличивался итд.
Вот скрины программы + код:
Вот программа
После 1 нажатия JButton "Начать поиск арматуры"
После 3 нажатий JButton с такими же параметрами
Вот нажатие с другими параметрами и как видим, просто заменились старые выводы на новые
а вот Код основных моментов реализации поиска, надеюсь всё понятно:
Вот List в котором весь объем данных (для удобства уменьшу объем данных)
public class ArmatureList {
public static List<CreateArmature> valvesList = new ArrayList<>();
public static void setValvesListList() {
valvesList.add(new CreateArmature
("Клапан", "Бабочка", "Фланцевое", "Бронза",
"Проходной", 40, 16, 4620, 0,
" иммется возможность установки ручного дублера")) ;
valvesList.add(new CreateArmature
("Клапан", "Бабочка", "Фланцевое", "Бронза",
"Проходной", 50, 16, 4620, 0,
" иммется возможность установки ручного дублера"));
valvesList.add(new CreateArmature
("Клапан", "Бабочка", "Фланцевое", "Чугун с шар. граф.",
"Проходной", 40, 16, 4620, 0,
" иммется возможность установки ручного дублера")) ;
valvesList.add(new CreateArmature
("Клапан", "Бабочка", "Фланцевое", "Чугун с шар. граф.",
"Проходной", 600, 10, 4620, 0,
" иммется возможность установки ручного дублера " +
"диаметры 600+ изготавливаются на заказ "));
}
}
Вот класс Create Armatura по которому создается лист с данными (в нём вроде бы не чего необычного)
public class CreateArmature {
private final String name;//имя
private final String typeOfUse;// тип использования
private final String connectionType;// тип соединения
private final String bodyComposition;// матриал корпуса
private final String typeOfConstruction;// Конструкция (проход/угл)
private final int DN;// DN
private final int PN;// PN
private final int fig;// fig.
private final int price;// цена
private final String comments;//Комментарии
public CreateArmature
(String name, String typeOfUse, String connectionType,
String bodyComposition, String typeOfConstruction,
int DN, int PN, int fig, int price, String comments) {
this.name = name; // 1
this.typeOfUse = typeOfUse;// 2
this.connectionType = connectionType;// 3
this.bodyComposition = bodyComposition;// 4
this.typeOfConstruction = typeOfConstruction;// 5
this.DN = DN;// 6
this.PN = PN;// 7
this.fig = fig;// 8
this.price = price;
this.comments = comments;
}
public String getName() { //1
return name;
}
public String getTypeOfUse() { //2
return typeOfUse;
}
public String getConnectionType() { //3
return connectionType;
}
public String getBodyComposition() { //4
return bodyComposition;
}
public String getTypeOfConstruction() {//5
return typeOfConstruction;
}
public int getDN() { //6
return DN;
}
public int getPN() { //7
return PN;
}
public int getFig() { //8
return fig;
}
public int getPrice() { //9
return price;
}
public String getComments() { //10
return comments;
}
@Override
public String toString() {
return name + " " + typeOfUse + " " + connectionType + " соединение" + " "+ bodyComposition + " "+ typeOfConstruction + " DN " + DN + " PN " + PN + " фиг."+ fig +
(price == 0 ? "" : (" примерная цена " + price)) + "\nКомментарий: " + comments + "\n\n";
}}}
А вот класс который описывает нажатие кнопки!!! Алгоритм такой, что идёт проверка всех JRadioButton и полей для заполнений и если все параметры выбраны, то мы попадаем в условие выполнения поиска по Листу valvesList, а если нет, то выводится сообщение о невыбранных параметрах
class ButtonEveLists implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
ArmatureList.setValvesListList();
if ((проходнаяRadioButton.isSelected() ||
угроловаяRadioButton.isSelected())
&&
(запорнаяRadioButton1.isSelected() ||
запорнаясСильфоннымУплотнениемRadioButton.isSelected() ||
невозратнаяОбратнаяRadioButton.isSelected() ||
невозвратноЗапорнаяRadioButton1.isSelected() ||
невозвратноПриемнаяRadioButton.isSelected() ||
бабочкаRadioButton.isSelected() ||
задвижкиRadioButton.isSelected() ||
ножевыеЗадвижкиRadioButton.isSelected())
&&
(бронзаRadioButton.isSelected() ||
бронзаRadioButton.isSelected() ||
стальRadioButton.isSelected() ||
нержСтальRadioButton.isSelected() ||
чугунRadioButton.isSelected() ||
чугунСШарГрафRadioButton.isSelected() ||
латуньRadioButton.isSelected())
&&
(фланцеваяRadioButton.isSelected() ||
межфланцеваяRadioButton.isSelected() ||
муфтоваяRadioButton.isSelected() ||
штуцернаяRadioButton.isSelected() ||
цапковаяRadioButton.isSelected() ||
подПриваркуRadioButton.isSelected())
&&
(PNTextField.getText().length() != 0)
&&
(textField1DN.getText().length() != 0)
) {
selectedCharacteristics();
int dn = Integer.parseInt(textField1DN.getText());
int pn = Integer.parseInt(PNTextField.getText());
List<CreateArmature> searchResult = new ArmatureSearch()
.setBodyComposition(bodyComposition)
.setTypeOfUse(typeOfUse)
.setConnectionType(connectionType)
.setTypeOfConstruction(typeOfConstruction)
.setDN(dn)
.setMinPn(pn)
.search(ArmatureList.valvesList);
textAreaResultsSearchArm.setText(String.valueOf(searchResult));
clearListArm();
} else {
textAreaResultsSearchArm.setText("Проверьте выбранные хиарактеристики, возможно " +
"вы допустили ошибку или не чего не найдено \n");
}
}
}
Вот метод selectedCharacteristics() который мы видим в Условии, когда после проверок всех JRadioButton попадаем в условие для поиска по листу valvesList.
public void selectedCharacteristics() {
if (бронзаRadioButton.isSelected()) {
bodyComposition = "Бронза";
} else if (стальRadioButton.isSelected()) {
bodyComposition = "Сталь";
} else if (нержСтальRadioButton.isSelected()) {
bodyComposition = "Нерж. сталь";
} else if (чугунRadioButton.isSelected()) {
bodyComposition = "чугун";
} else if (чугунСШарГрафRadioButton.isSelected()) {
bodyComposition = "Чугун с шар. граф.";
} else if (латуньRadioButton.isSelected()) {
bodyComposition = "Латунь";
}
if (запорнаяRadioButton1.isSelected()) {
typeOfUse = "Запорный";
} else if (запорнаясСильфоннымУплотнениемRadioButton.isSelected()) {
typeOfUse = "Запорный с сильфонным уплотнением";
} else if (невозратнаяОбратнаяRadioButton.isSelected()) {
typeOfUse = "Обратный";
} else if (невозвратноЗапорнаяRadioButton1.isSelected()) {
typeOfUse = "Невозвратно-запорный";
} else if (невозвратноПриемнаяRadioButton.isSelected()) {
typeOfUse = "Бабочка";
} else if (задвижкиRadioButton.isSelected()) {
typeOfUse = "Задвижка";
} else if (ножевыеЗадвижкиRadioButton.isSelected()) {
typeOfUse = "Ножевая задвижка";
}
if (фланцеваяRadioButton.isSelected()) {
connectionType = "Фланцевое";
} else if (межфланцеваяRadioButton.isSelected()) {
connectionType = "Межфланцевое";
} else if (муфтоваяRadioButton.isSelected()) {
connectionType = "Муфтовое";
} else if (штуцернаяRadioButton.isSelected()) {
connectionType = "Штуцерная";
} else if (цапковаяRadioButton.isSelected()) {
connectionType = "Цапковое";
} else if (подПриваркуRadioButton.isSelected()) {
connectionType = "Под приварку";
}
if (проходнаяRadioButton.isSelected()) {
typeOfConstruction = "Проходной";
} else if (угроловаяRadioButton.isSelected()) {
typeOfConstruction = "Угловой";
}
}
Думаю что проблема легко решается, но увы не получается найти решение, пробовал и clear() и пустое значение забивать в JTextArea, да что только не делал. Чувствую, что где то рядом, но не как не добраться.
А вот класс реализации поиска по List. Вот его я и нашел на просторах интернета и до конца сам не осознал. Оптимизировал под свой код. Всё работает, но до конца не могу понять как.
public class ArmatureSearch extends ArmatureList {
private String name;
private String typeOfUse;// тип использования
private String connectionType;// тип соединения
private String bodyComposition;// матриал корпуса
private String typeOfConstruction;// Конструкция (проход/угл)
private Integer DN; // DN
private Integer minPn;
private Integer maxPn;
private Integer fig;// fig.
public ArmatureSearch setName(String name) {
this.name = name;
return this;
}
public ArmatureSearch setTypeOfUse(String typeOfUse) {
this.typeOfUse = typeOfUse;
return this;
}
public ArmatureSearch setConnectionType(String connectionType) {
this.connectionType = connectionType;
return this;
}
public ArmatureSearch setBodyComposition(String bodyComposition) {
this.bodyComposition = bodyComposition;
return this;
}
public ArmatureSearch setTypeOfConstruction(String typeOfConstruction) {
this.typeOfConstruction = typeOfConstruction;
return this;
}
public ArmatureSearch setDN(Integer DN) {
this.DN = DN;
return this;
}
public ArmatureSearch setMinPn(Integer minPn) {
this.minPn = minPn;
return this;
}
public ArmatureSearch setMaxPn(Integer maxPn) {
this.maxPn = maxPn;
return this;
}
public ArmatureSearch setFig(Integer fig) {
this.fig = fig;
return this;
}
public List<CreateArmature> search(Collection<CreateArmature> valvesList) {
return valvesList.stream()
.filter(createArmature->name == null || createArmature.getName().equals(name))
.filter(createArmature->typeOfUse == null || createArmature.getTypeOfUse().equals(typeOfUse))
.filter(createArmature->connectionType == null || createArmature.getConnectionType().equals(connectionType))
.filter(createArmature->bodyComposition == null || createArmature.getBodyComposition().equals(bodyComposition))
.filter(createArmature->typeOfConstruction == null || createArmature.getTypeOfConstruction().equals(typeOfConstruction))
.filter(createArmature->typeOfConstruction == null || createArmature.getTypeOfConstruction().equals(typeOfConstruction))
.filter(createArmature->DN == null || createArmature.getDN()==(DN))
.filter(createArmature->rangeOf(createArmature.getPN(), minPn, maxPn))
.filter(createArmature->fig == null || createArmature.getFig()==(fig))
.collect(Collectors.toList());
}
private boolean rangeOf(Integer value, Integer min, Integer max) {
if (min==null && max==null) return true;
if (min!=null && max==null && min<=value) return true;
if (max!=null && min==null && max>=value) return true;
if (max!=null && min!=null && max>=value && min<=value) return true;
return false;
}}
Повторяю: Как сделать так, чтобы в JTextArea после нажатия JButton "Начать поиск арматуры" не добавлялся результат поиска к прошлому результату, а был как после 1го нажатия JButton, а не увеличивался итд.
PS Не ругайтесь, знаком с программированием около 2х недель. Посмотрел несколько коротких уроков по Java, и мне захотелось написать программу которая поможет лично мне на моей работе. Дошел до изучения Swing (через GUI), а как мне реализовать поиск по List нашел на просторах интернета, парился , не мог понять как вообще по характеристика что то искать. создавал объекты другого класса и пытался как то по ним искать и не понял как. Но нашел решение в реализации поиска через List. В будущем дойду до SQL итд итп, а пока хотелось бы так вот доделать эту прогу. (делаю просто так как хобби, для общего развития).
Ответы (1 шт):
Оказалось всё просто.
Нужно было clear() лист по которому создавался лист для вывода в JTextArea, но после добавления результата в JTextArea.
вот код условия из кнопки с добавленным ArmatureList.valvesList.clear();
List<CreateArmature> searchResult = new ArmatureSearch()
.setBodyComposition(bodyComposition)
.setTypeOfUse(typeOfUse)
.setConnectionType(connectionType)
.setTypeOfConstruction(typeOfConstruction)
.setDN(dn)
.setMinPn(pn)
.search(ArmatureList.valvesList);
textAreaResultsSearchArm.setText(String.valueOf(searchResult));
ArmatureList.valvesList.clear();
ps в след. раз буду более понятно и ёмко писать. Всем спасибо!



