我正在尝试编写自己的ListSelectionModel实现,目前我在尝试实现insertIndexInterval
时遇到了困难。我不理解Sun/Oracle的DefautListSelectionModel
实现中这个方法的结果。以下是一个示例:
ListSelectionModel model = new DefaultListSelectionModel();
model.setSelectionInterval(3, 5);
model.addListSelectionListener(new ListSelectionListener()
{
public void valueChanged(ListSelectionEvent e)
{
System.out.println("Changed range reported by event: " +
e.getFirstIndex() + "-" + e.getLastIndex());
}
});
System.out.print("Selected indices before insert: ");
for (int i = model.getMinSelectionIndex(); i <= model.getMaxSelectionIndex(); i++)
if (model.isSelectedIndex(i)) System.out.print(i + " ");
System.out.println();
model.insertIndexInterval(3, 3, true);
System.out.print("Selected indices after insert: ");
for (int i = model.getMinSelectionIndex(); i <= model.getMaxSelectionIndex(); i++)
if (model.isSelectedIndex(i)) System.out.print(i + " ");
System.out.println();
当您运行此代码时,您将获得以下输出:
Selected indices before insert: 3 4 5
Changed range reported by event: 3-8
Selected indices after insert: 3 4 5 6 7 8
最初的选择范围是3-5,在插入新索引时扩展为3-8。但是因为已经选中了3-5,所以实际更改的只有6-8。为什么事件告诉我范围为3-8的内容已被更改呢?当你将insertIndexInterval
调用更改为以下内容时,情况变得更加混乱:
model.insertIndexInterval(3, 3, false);
现在的输出结果是这样的:
Selected indices before insert: 3 4 5
Changed range reported by event: 5-8
Selected indices after insert: 3 4 5 6 7 8
我不知道为什么报告的变化是5-8。
这个方法的API文档太简短了,无法理解其中发生了什么。特别是这个before
参数对我来说是一个谜,因为它对选择没有任何影响,但似乎对事件和引线和锚点索引有一些影响。
我甚至不能为我的实现编写单元测试,因为我根本不知道预期结果。
那么,有人能详细解释一下这个方法(尤其是before
标志)正在做什么,以及它对选择模型和ListSelectionEvent
的副作用吗?