Как да изчистите JList в Java?

имам jList в gui, където мога да добавя някои данни с бутона Add. какво искам да добавя друг бутон, наречен Clear, който ще изчисти всички елементи. пробвах това:

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
добре за copmile грешките с вашата модификация, сега, когато щракна върху бутона Изчисти, той добавя някои нови данни, за които не знам, че идват от... Но опитах това и изчиства всички данни, но когато щракна върху бутона Добавяне, добавя нови данни, но запазва старите преди изчистване: код: 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(); jPanelVizualisationOptions1.update(); currentPanel.refresh(); - 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
Здравей Nathanzkie. Добре дошли в Stack Overflow и ви благодарим за вашия принос! Но докато този код може да отговори на въпроса, предоставянето на допълнителен контекст относно защо и/или как този код отговаря на въпроса подобрява неговата дългосрочна стойност. Съвети за отговори. Поздрави. - person Elletlar; 20.11.2020