JscrollPane не обновляется при изменении модели JList (качание Java)

У меня есть JList с пользовательской моделью DefaultListModel. JList находится внутри JScrollPane, который находится внутри JTabbedPane. Когда я обновляю модель, добавляя или удаляя элементы, я не вижу изменений на странице, хотя модель изменилась должным образом.

Я попытался перепроверить() и перекрасить() все, и это не изменилось.

А теперь самое смешное. Если я печатаю все в модели с помощью for (int i = 0; i ‹ model.size(); i++) model.get(i), он показывает только измененный список. НО, если я просмотрю список внутри своей пользовательской модели, опубликовав его, ничего не изменится.

Список обновлений я могу просматривать только в том случае, если я создаю и устанавливаю новую модель с другим списком, который я заполнил вручную.

TLDR;

После изменения списка в пользовательской модели DefaultListModel с помощью addElement и removeElement, как это может отображать измененный список:

for (int i = 0; i < model.size(); i++) {
        System.out.println(model.get(i));
    }

И это показывает исходный список, и поэтому представление не обновляется.

for (Object object : model.list) {
        System.out.println(object);
    }

Мой класс DefaultListModel

public class ObjectListModel extends DefaultListModel
{
    final List<Object> list;

    public ObjectListModel(List<Object> list) {
        this.list = list;
    }

    @Override
    public int getSize() {
        return list.size();
    }

    @Override
   public Object getElementAt(int index) {
        return list.get(index);
    }
}

person Matomatt    schedule 23.05.2020    source источник


Ответы (1)


Это не правильно:

public class ObjectListModel extends DefaultListModel
{
    final List<Object> list;  // <===== this here

DefaultListModel уже имеет ядро ​​данных, которое поддерживает модель, поэтому ваше поле списка игнорирует и безуспешно пытается переопределить это.

Касательно:

После изменения списка в пользовательской модели DefaultListModel с помощью addElement и removeElement, как это может отображать измененный список:

И вызов этих методов изменит ядро ​​данных, которое DefaultListModel содержит по умолчанию, и ни в малейшей степени не изменит ваше собственное поле списка.

Я предлагаю вам либо избавиться от поля списка и вместо этого передать данные суперобъекту, включая его конструктор, если это необходимо, либо расширить AbstractListModel, а затем, конечно, использовать собственное ядро ​​данных. Если вы используете класс, производный от AbstractListModel, вы должны позаботиться о правильном вызове методов уведомления при изменении модели, о чем за вас позаботится DefaultListModel.

Честно говоря, исходя из того, что вы публикуете, и если у вас нет требований, не упомянутых в вашем вопросе, я не уверен, что вам даже нужно расширять либо DefaultListModel, либо AbstractListModel, а просто использовать DefaultListModel как есть.

person Hovercraft Full Of Eels    schedule 23.05.2020
comment
Понятно, поскольку вначале я использовал AbstractListModel, я подумал, что DefaultListModel также нужен список, поскольку конструктор не принимает никаких аргументов. Я хотел избежать цикла for для заполнения модели, но в конце концов я делаю это, когда фильтрую список, так что да. Я сделал все это, потому что думал, что вы можете установить ViewportView только с Jlist‹String›... Большое спасибо, теперь все работает отлично! - person Matomatt; 24.05.2020