Java 为什么我的ListSelectionListener在使用removeAll(和e.getValueIsAdjusting==false)从列表中删除多个项目时会看到多个事件?

Java 为什么我的ListSelectionListener在使用removeAll(和e.getValueIsAdjusting==false)从列表中删除多个项目时会看到多个事件?,java,jtable,jlist,glazedlists,Java,Jtable,Jlist,Glazedlists,在下面的示例中,我使用glazedList的EventList和EventTableModel。我不确定这有什么不同。我有一个表,我正在监视选择的更改。当我删除多个项目时,ListSelectionListener会看到多个事件,并且当在处理程序中时,表报告的选定索引与删除之前的模型状态相匹配,即使模型已经更改 当我运行下面的示例时,列表中添加了7项。如果我选择最后两项,以下输出将在控制台上结束: 所选行数:2 项目列表大小:7 选定索引:5 选定索引:6 这正是我所期望的,但当我删除这两项时

在下面的示例中,我使用glazedList的
EventList
EventTableModel
。我不确定这有什么不同。我有一个表,我正在监视选择的更改。当我删除多个项目时,
ListSelectionListener
会看到多个事件,并且当在处理程序中时,表报告的选定索引与删除之前的模型状态相匹配,即使模型已经更改

当我运行下面的示例时,列表中添加了7项。如果我选择最后两项,以下输出将在控制台上结束:

所选行数:2
项目列表大小:7
选定索引:5
选定索引:6
这正是我所期望的,但当我删除这两项时,我会得到以下输出:

所选行数:1
项目列表大小:5
选定索引:5
所选行数:0
项目列表大小:5
由于我正在使用列表上的
removeAll
删除连续块中的项目,因此我假设这是一个事件,但
ListSelectionListener
似乎收到通知,好像它是两个独立的事件。如果我删除4个项目,侦听器将看到4个事件

桌子和模型不同步了,但我不知道为什么。如果从列表末尾删除项目,则表报告的选定索引可能大于基础列表大小。基本上,从
JTable.getSelectedRows
返回的索引在基础模型上调用
removeAll
导致的最后一个选择事件之前是不可靠的

在列表选择稳定且
JTable
将报告正确选择的索引后,如何获得有关选择更改的通知

导入ca.odell.glazedlist.BasicEventList;
导入ca.odell.glazedlists.EventList;
导入ca.odell.glazedlists.gui.AdvancedTableFormat;
导入ca.odell.glazedlists.impl.sort.CompariableComparator;
导入ca.odell.glazedlists.swing.EventTableModel;
导入javax.swing.*;
导入javax.swing.event.ListSelectionEvent;
导入javax.swing.event.ListSelectionListener;
导入java.awt.*;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.util.ArrayList;
导入java.util.Comparator;
导入java.util.List;
在关闭时导入静态javax.swing.WindowConstants.EXIT;
公共类多重删除主{
//应添加到模型中的项目数。
@抑制警告(“FieldCanBeLocal”)
私有最终整数项计数=7;
私有事件列表项目列表;
私有JTable项表;
公共静态void main(字符串[]args){
新的MultiDeleteMain();
}
公共多删除main(){
SwingUtilities.invokeLater(新的Runnable(){
@抑制警告(“恒定条件”)
@凌驾
公开募捐{
//delete函数需要访问列表和表,因此
//它们存储为实例变量。
itemList=createItemList();
itemTable=createItemTable(itemList);
addListSelectionListenerToItemTable(itemTable);
JPanel mainPanel=newjpanel(newborderlayout());
添加(createDeleteButton(),BorderLayout.NORTH);
添加(新的JScrollPane(itemTable),BorderLayout.CENTER);
JFrame mainFrame=新JFrame(“列表测试中的多重删除”);
mainFrame.setContentPane(主面板);
mainFrame.pack();
mainFrame.setSize(300,mainFrame.getHeight());
mainFrame.setLocationRelativeTo(空);
mainFrame.setDefaultCloseOperation(关闭时退出);
mainFrame.setVisible(true);
}
});
}
私有事件列表createItemList(){
EventList itemList=新的基本事件列表();
对于(int i=0;i