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 ответов


нужно позвонить fireContentsChanged() на ListModel.


вместо 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);. Хотя это несколько громоздко и имеет подкласс кажется более чистым подходом.