Как сообщить Cellrenderer JList о внезапных изменениях JList?

У меня есть JList, который будет указывать на выбранный JList в зависимости от пользователя. Он действует как монитор, который будет отслеживать выбранный JList. Когда я реализую настраиваемое средство визуализации ячеек и программно делаю что-то вроде this.list = getSelectedList(), средство визуализации ячеек не реагирует на это внезапное изменение информации. Как мне уведомить JList о необходимости повторной оценки данных списка без необходимости вызывать функцию добавления / удаления?


person user385261    schedule 21.04.2012    source источник
comment
Вы имеете в виду, что у вас есть JList A, который визуализирует те же данные, что и другой выбранный JList, и пользователь может изменить «выбранный список», в какой момент список A должен отображать данные, содержащиеся в новом «выбранном списке»?   -  person Robin    schedule 21.04.2012
comment
Да, предполагается, что показывать выбранные данные списка   -  person user385261    schedule 21.04.2012
comment
не понимаю, где / как рендерер вступает в игру? Предполагая, что @Robin описал ваше требование (один jlist, который показывает данные выбранного списка из множества jlists). А как определить выделенное?   -  person kleopatra    schedule 21.04.2012
comment
@ user385261 (+1 для обоих) Я думаю, что ответы там коснулись остальных вопросов, отредактируйте свое сообщение с помощью SSCCE   -  person mKorbel    schedule 21.04.2012


Ответы (2)


this.list = getSelectedList() влияет на другой объект JList на поле this.list. Если вы установите для пользовательского рендерера значение this.list перед выполнением этой строки, вы установите рендерер на другой объект JList, и никаким образом, чтобы рендерер не стал волшебным образом присоединиться к новому выбранному списку.

Вы путаете переменные и объекты. Когда вы вызываете метод объекта, вы изменяете объект, на который указывает переменная, а не саму переменную. Если вы хотите присоединить то же средство визуализации ячеек к недавно выбранному JList, вам понадобится следующий код:

ListCellRenderer renderer = this.list.getCellRenderer();
this.list = getSelectedList();
this.list.setCellRenderer(renderer);
person JB Nizet    schedule 21.04.2012

Из комментариев под вопросом, как я понял, у вас есть один список A, который должен отображать содержимое другого списка. Список A должен отображать содержимое списка, выбранного пользователем, и у вас возникает проблема, когда пользователь изменяет «выбранный список».

Вы можете поделиться ListModel за JList экземплярами. Итак, у вас может быть что-то вроде

public void selectionChanged( JList selectedList ){
  //update the model of this.list to match the model of selectedList
  this.list.setModel( selectedList.getModel() );
}
person Robin    schedule 21.04.2012