Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Java программирование > Общие вопросы по Java, Java SE, Kotlin
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.01.2016, 16:25   #1
yulia
Форумчанин
 
Аватар для yulia
 
Регистрация: 24.03.2007
Сообщений: 314
По умолчанию ListSelectionListener

Добрый день! Я совершенно запуталась в этом ListSelectionListener и когда вызывается valueChanged. Помогите, пожалуйста разобраться.

Для начала есть глобальная переменная

Код:
private Person currObject;
Person - это класс, который хранит личные данные. Я буду дальше объяснять на примере только одного поля LastName.

На форме есть JList, в котором отображается DefaultListModel<Person>, кнопка, по которой создается новая запись и поле, в которое заносится фамилия.

При нажатии кнопки
Код:
if (array1.size()==0) { 
        	 currObject = new Person(); //Создаем нового Человека
            	 list.setListData(createArray(currObject).toArray()); //Добавляем его в список и обновляем JList
          }
          else {
            	 if (!array1.lastElement().getDisplayName().equals("null null")) {
            		currObject = new Person();
            		 list.setListData(createArray(currObject).toArray());
            	}
        }
При этом currObject - объект Person со значением null во всех полях

Потом мы в JList выделяем этот объект и надо его отредактировать, чтобы заполнить поля.

У поля на форме есть слушатель
Код:
 fldLastName.addActionListener(new ActionListener() {
		
		@Override
		public void actionPerformed(ActionEvent e) {
			currObject.setLastName(fldLastName.getText()); //берем данные из поля
					
		}
	});
Ну и есть слушатель у списка
Код:
 list.addListSelectionListener(new ListSelectionListener() {
		
		@Override
		public void valueChanged(ListSelectionEvent e) {
		currObject = (Person)list.getSelectedValue();//берем выделенный объект
			
		if (currObject.getLastName()==null) fldLastName.setText("");
		else  fldLastName.setText(currObject.getLastName()); // если у выделенного объекта уже есть Фамилия, то заносим ее в поле на форме
		}
	});
Теперь русским языком, что должно быть: создаем новую запись, сначала она пустая добавляется в список. Потом из списка выбираем ее или любую другую для редактирования и с помощью полей редактируем.

Новая запись создается нормально. Потом мы ее выбираем, и когда хотим редактировать, то при обновлении JList, вызывается valueChanged, выделение уходит и вылетает NPE на строке if (currObject.getLastName()==null) fldLastName.setText("");...
yulia вне форума Ответить с цитированием
Старый 13.01.2016, 17:19   #2
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Может запись без данных приравнивается к NULL и удаляется. Вставьте вместо пустой строки, типа "Новая папка" потом "Новая папка (2)" и т.д. Если будет работать нормально, думайте что писать вместо новой папки, или меняйте алгоритм.
Человек_Борща вне форума Ответить с цитированием
Старый 13.01.2016, 20:22   #3
yulia
Форумчанин
 
Аватар для yulia
 
Регистрация: 24.03.2007
Сообщений: 314
По умолчанию

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
Может запись без данных приравнивается к NULL и удаляется. Вставьте вместо пустой строки, типа "Новая папка" потом "Новая папка (2)" и т.д. Если будет работать нормально, думайте что писать вместо новой папки, или меняйте алгоритм.
Если просто выделить запись и не пытаться ничего редактировать, то все работает, т.е. пустые записи есть пустые записи.

Я думаю, что вот тут list.setListData(createArray(currOb ject).toArray());, когда обновляется JList и пропадает выделение, вот эта строка currObject = (Person)list.getSelectedValue(); присваивает что-то не то, поэтому дальше идет ссылка на нулл.

Но вот почему так и как исправить, не могу понять



Уважаемые форумчане, простите за так много букв, но форум творит чудеса... 2 дня мучилась, а написала, все по полочкам разложила и разобралась. Помогла строка
list.setSelectedValue(currObject, true);, добавленная в нужном месте после обновления списка.

Спасибо за внимание!

Последний раз редактировалось yulia; 13.01.2016 в 20:43.
yulia вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц