Ошибка приведения JList к DefaultListModel

Я реализовал кнопку, которая просто удалит "контакт" из списка контактов JList. Предполагается, что программа должна сделать, если кнопка удалит "Broadcast", который является первым элементом в contactList, вернет ошибку, выведя сообщение на экран. В противном случае предполагается просто удалить контакт из списка контактов.

У меня вопрос, как правильно удалить контакт из JList с помощью DefaultListModel? Я видел, что нужно использовать DefaultListModel, потому что функция удаления отсутствует ни в JList, ни в ListModel.

Как может выглядеть пример списка контактов размером 4:

[Broadcast]
[Andro]
[Denis]
[Micheal]
...

Это ошибка:

[java] Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: javax.swing.JList$4 cannot be cast to javax.swing.DefaultListModel
... //rest of error

Код:

private JList<String> listContacts;

//constructor:
listContacts = new JList<String>(controller.getContacts());
//gets contact list from controller class which gets contact list from client class.
listContacts.setModel(new DefaultListModel());

JButton deleteUser = new JButton("Delete User");
menuPanel.add(deleteUser,BorderLayout.EAST);
deleteUser.addActionListener(new MyButtonListener5());

class MyButtonListener5 implements ActionListener{
public void actionPerformed(ActionEvent e){
    DefaultListModel<String> list = (DefaultListModel)(listContacts.getModel());
    String contact = listContacts.getSelectedValue();
    int j = -1;
    for(int i = list.getSize()-1; i >= 0; i--){
        if(list.getElementAt(i).equals("Broadcast")) {
            controller.displayMsg("[ERROR] You cannot delete broadcast\n");
        }
        else if(list.getElementAt(i).equals(contact)){
            j = i;
        }
    }
    if(j != -1){
        list.remove(j); 
    }
}

1 ответ

(DefaultListModel)list.remove(j); 

list.remove() возвращает элемент, который был удален из списка, который в вашем случае является строкой. Почему вы приводите его в DefaultListModel?

или ты действительно имел ввиду

((DefaultListModel<String>)list).remove(j); 

который преобразует "список" в DefaultListModel, а затем вызывает метод remove () этой модели. Но "список" уже объявлен как DefaultListModel, поэтому приведение является излишним. Просто избавься от актеров.

Другие вопросы по тегам