Java - Обновление JList после изменения объекта - PullRequest
7 голосов
/ 26 марта 2012

У меня есть 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 ]

12 голосов
/ 26 марта 2012

Вместо setModel() обновите существующую модель, используя один из методов DefaultListModel, например setElementAt(), который для вас будет fireContentsChanged().

3 голосов
/ 26 марта 2012

Вам необходимо позвонить fireContentsChanged() в ListModel.

0 голосов
/ 19 июля 2014

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

...