Не могу понять, как лучше это реализовать. Вот два варианта, которые я придумал. Я надеюсь, что смогу получить ответ на следующие вопросы:
- какой вариант определенно лучший
- Какой вариант категорически не рекомендуется или это плохая практика, и почему.
Скопируйте MutableList в массив и добавьте содержимое массива в JList с использованием DefaultListModel. Это означает, что мне нужно будет добавить прослушиватель при обновлении модели списка и обновить MutableList, чтобы он был «синхронизирован» с данными модели JList. Пример:
fun main() {
val myData = mutableListOf(/* Add a bunch of data */)
val myJList = JList(DefaultListModel()).apply {
model as DefaultListModel
model.addAll(myData.toTypedArray())
model.addListDataListener {
/* Manually update myData here for additions/deletions */
}
}
}
Кажется немного обременительным поддерживать синхронизацию данных модели JList с myList с помощью прослушивателей.
Вариант 2
Создайте подкласс AbstractListModel, который принимает ссылку на MutableList. Это избавит меня от необходимости добавлять прослушиватели и вручную синхронизировать данные друг с другом, поскольку JList будет изменять данные в исходном списке.
Пример:
fun main() {
val myData = mutableListOf(/* Add a bunch of data */)
val myJList = JList(ReferenceListModel(myList))
}
class ReferenceListModel(
private val delegateList: MutableList,
) : AbstractListModel() {
/* In this class, I would implement all required methods per the superclass
* a and include public methods for adding and removing to the list.
* This would be editing the originally created list in main(), so I would not
* need to add listeners to this model in order to update the original list.
*/
}
Подробнее здесь: https://stackoverflow.com/questions/793 ... conforms-t