我有一个JList,我从MySQL数据库填充。这工作正常,我可以在JScrollPane中看到结果,但是,当我再次执行查询时,结果被添加到JList;因此,如果有10行数据,则在2次查询后显示20,每行的副本。
我想在重新查询之前删除JList中的所有元素,以便它只显示那里的内容,而不是重复的数据。
我有:
ArrayList<String> results;
JList list;
JScrollPane listScroller;
... //button event and arraylist population
for(int i=0; i < list.getModel().getSize(); i++){
list.remove(i)
}
list = new JList(results.toArray);
listScroller.setViewportView(list);
当我调试它时,即使认为有50个元素,i,在for循环中,在25处停止然后抛出一个异常,说25超出界限。
有什么建议吗?
答案 0 :(得分:3)
您的代码正在从列表中删除元素(在每次迭代中,列表的大小减1)。因此,当您到达i==25
时,列表的大小为25,当您尝试删除第25个元素时,您将超出列表范围。
尝试这种方法:
while (list.getModel().getSize() > 0) {
list.remove(0);
}
OP编辑:
循环中list.remove(i)
的问题在于每次删除JList中的元素时都会填充索引。因此,如果i = 0
并且有10个元素,则删除第一个元素,然后只有9个元素,它们采用索引0到8.当你到达i = 5
时,你只剩下5个元素,4个是最高索引,所以你得到一个越界异常。
通过每次删除第一个索引(0)来避免这种情况。
答案 1 :(得分:2)
您可以在没有while循环的情况下执行此操作:
DefaultListModel listModel = (DefaultListModel) yourJList.getModel();
listModel.removeAllElements();
答案 2 :(得分:0)
覆盖列表中的数据会更快....
list.setListData(new String[0])