Java-обновление JList после изменения объекта
у меня есть JList, который использует DefaultListModel.
затем я добавляю значения в модель, которые затем появляются в JList. Я создал MouseListener, который (при двойном щелчке) позволяет пользователю редактировать текущий номер пользователя того человека, которого они выбрали.
Я проверил, что фактический объект этой записи изменяется, и это так. Единственная проблема, с которой я сталкиваюсь, - это получение фактического Jlist для обновления, чтобы показать новые значения этого объект.
фрагменты текущего кода, который у меня есть:
создание JList и DefaultTableModel:
m = new DefaultListModel();
m.addListDataListener(this);
jl = new JList(m);
jl.addMouseListener(this);
обновление объекта:
String sEditedNumber = JOptionPane.showInputDialog(this, "Edit number for " + name, number);
if (sEditedNumber != null) {
directory.update (name, sEditedNumber);
}
и (когда jl-JList, а m-DefaultTableModel):
public void contentsChanged(ListDataEvent arg0) {
jl.setModel(m);
}
3 ответов
вместо setModel()
, обновите существующую модель, используя один из DefaultListModel
методы, такие как setElementAt()
, который fireContentsChanged()
для вас.
нужно позвонить DefaultListModel.fireContentsChanged()
. Но поскольку этот метод защищен (мне действительно интересно, почему), вы не можете сделать это напрямую. Вместо этого сделайте небольшой подкласс:
class MinoListModel<T> extends DefaultListModel<T>
{
public void update(int index)
{
fireContentsChanged(this, index, index);
}
}
использовать его в качестве модели списка:
m = new MinoListModel<>();
jl = new JList(m);
после обновления номера пользователя обновите соответствующую запись:m.update(theIndex);
кроме того, если вы не хотите подкласс, вы можете просто заменить элемент JList после изменения номера пользователя:m.setElementAt(theSameElement, theIndex);
. Хотя это несколько громоздко и имеет подкласс кажется более чистым подходом.