Как очистить JList в Java?

у меня есть jList в графическом интерфейсе, где я могу добавить некоторые данные с помощью кнопки «Добавить». что я хочу добавить еще одну кнопку под названием «Очистить», которая очистит все элементы. я пробовал это:

private void jButtonClearActionPerfomed(java.awt.event.ActionEvent evt)
{
    DefaultListModel listmodel=new DefaultListModel();
    jList1 = new JList(listmodel);
    if(evt.getSource()==jButtonClear) JList.setListData(new String[0];
    else listmodel.removeAllElements();
}

Когда я нажимаю кнопку «Добавить», это добавит элементы.

Когда я нажимаю кнопку «Очистить», это удаляет элементы.

Но когда я повторно нажимаю кнопку «Добавить», в jList1 ничего нет.


person Pan24112012    schedule 28.11.2012    source источник


Ответы (4)


Вы не должны повторно инициализировать весь виджет JList только для того, чтобы удалить из него некоторые элементы. Вместо этого вы должны манипулировать моделью списков, поскольку изменения в ней «автоматически» синхронизируются с пользовательским интерфейсом. Предполагая, что вы действительно используете DefaultListModel, этого достаточно для реализации функции «Очистить все»:

private void jButtonClearActionPerfomed(java.awt.event.ActionEvent evt) {
    if(evt.getSource()==jButtonClear) {
        DefaultListModel listModel = (DefaultListModel) jList1.getModel();
        listModel.removeAllElements();
    }
}
person Perception    schedule 28.11.2012

Есть ряд проблем, первая из которых заключалась в том, что ваш пример полон проблем с компиляцией, поэтому я надеюсь, что это не ваш реальный код.

JList не имеет статического метода с именем setListData. Я думаю, вы имеете в виду jList1 вместо этого.

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

private void jButtonClearActionPerfomed(java.awt.event.ActionEvent evt)
{
    // ??
    DefaultListModel listmodel=new DefaultListModel();
    jList1 = new JList(listmodel);
    // ??
    if(evt.getSource()==jButtonClear) jList1.setListData(new String[0]);
    else listmodel.removeAllElements();
}

Вы успешно разыменовали то, на что когда-либо указывал jList1, поэтому каждый раз, когда вы пытаетесь взаимодействовать с ним, вы больше не взаимодействуете с компонентом на экране.

Другая проблема заключается в том, что вы предоставляете пустой массив методу setListData, что в основном похоже на фразу «пожалуйста, ничего не добавляйте в мой список».

Попробуйте что-то вроде этого;

private void jButtonClearActionPerfomed(java.awt.event.ActionEvent evt)
{
    DefaultListModel listmodel = (DefaultListModel)jList1.getModel();
    if(evt.getSource()==jButtonClear) {
        listmodel.removeAllElements();
    } else {
        listModel.addElement(new String[]{"Hello"});
    }
}
person MadProgrammer    schedule 28.11.2012
comment
хорошо для ошибок копирования с вашей модификацией, теперь, когда я нажимаю кнопку «Очистить», он добавляет некоторые новые данные, о которых я не знаю, откуда они ... Но я пытаюсь это сделать, и он очищает все данные, но когда я нажимаю кнопку «Добавить», это добавляет новые данные, но сохраняет старые данные перед очисткой: код: DefaultListModel listmodel=(DefaultListModel)JList1.getModel(); evt.getSource()==jButtonClear{ listmodel.removeAllElements(); - person Pan24112012; 28.11.2012
comment
Я переключил условия (так что теперь clear вызывает removeAll), иначе он добавит новый элемент. Я украл ваш код и не позаботился о его исправлении. Я не уверен, является ли это общим кодом с другим событием действия или нет. Если нет, удалите строку addElement - person MadProgrammer; 28.11.2012
comment
да, это общий код с кнопкой «Добавить», я не могу поместить сюда код, потому что я здесь новенький, но вот что находится в конце кода кнопки «Добавить»: jList1.repaint(); jPanelVizualizationOptions1.update(); текущая панель.обновить(); - person Pan24112012; 28.11.2012

попробуй это:

DefaultListModel model = new DefaultListModel();
model.clear();
jList1.setModel(model);
person Shinwar ismail    schedule 19.10.2017

Попробуй это:

DefaultListModel listmodel=new DefaultListModel();

JList.setModel(listmodel);
person Nathanzkie    schedule 19.11.2020
comment
Привет, Натански. Добро пожаловать в Stack Overflow и спасибо за ваш вклад! Но хотя этот код может дать ответ на вопрос, предоставление дополнительного контекста относительно того, почему и/или как этот код отвечает на вопрос, повышает его ценность в долгосрочной перспективе. Советы для ответов. С уважением. - person Elletlar; 20.11.2020