我正在尝试为ListSelectionListener
写一个JList
,它知道用户正在选择哪个列表项,以及用户选择哪个列表项。因此,如果列表中包含三个项目{Apple, Orange, Pear}
,并且当前选择位于Orange
且用户选择Pear
,则:
srcFruit
是Orange
;和destFruit
是Pear
这是我的代码:
myList.addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent fruitSelectionEvent) {
printSourceAndDestFruit(myList, fruitSelectionEvent);
}
});
private void printSourceAndDestFruit(JList list, ListSelectionEvent event) {
FruitVO srcFruit = (FruitVO)list.getModel().getElementAt(event.getFirstIndex());
FruitVO destFruit = (FruitVO)list.getModel().getElementAt(event.getLastIndex());
System.out.println("srcFruit = " + srcFruit.getName() + " and destFruit = " = destFruit.getName());
}
当应用程序加载并初始化JList
时,没有默认选择。当我采取以下行动时:
Orange
Pear
Orange
这是我得到的打印件:
srcFruit = Orange and destFruit = Pear
srcFruit = Orange and destFruit = Pear
我在哪里错了?是getFirstIndex()
/ getLastIndex()
错误还是没有使用正确的Swing方法?
这是我应该看到的输出:
srcFruit = Orange and destFruit = Pear
srcFruit = Pear and destFruit = Orange
所以即使我做了3次选择(鼠标点击),因为我第一次点击Orange
并不是从一个值到下一个值的变化,我相信它是正确的不要开火并拨打printSourceAndDestFruit
。我选择了Pear
,说明srcFruit
为Orange
且destFruit
为Pear
是正确的。但是当我点击回Orange
时,第二张println应该srcFruit
为Pear
而destFruit
为Orange
。 为什么不呢?!?!
提前致谢!
答案 0 :(得分:3)
第一个和最后一个索引不是您认为的那样。以下是javadoc所说的内容:
getFirstIndex()
返回其选择可能已更改的第一行的索引。
getLastIndex()
返回其选择可能已更改的最后一行的索引。
因此,由于梨和橙的选择在每次点击时都会发生变化,并且由于梨在列表中位于橙色之后,因此getFirstIndex()
始终返回橙色,getLastIndex()
始终返回梨。
如果要将新选择与最后一个选择进行比较,则将最后一个选择保留在某个成员变量中,并在每次选择更改时将其与新选择进行比较,getValueIsAdjusting()
返回false。
答案 1 :(得分:1)
选择的顺序为Orange
,Pear
的原因是DefaultListSelectionModel
仅ListModel
根据FruitVO srcFruit = (FruitVO)list.getModel().getElementAt(list.getMinSelectionIndex());
FruitVO destFruit = (FruitVO)list.getModel().getElementAt(list.getMaxSelectionIndex());
中的项目索引位置调用fireValueChanged而不是新的选择指数。
此相关bug report提出了类似的问题但显示这是正常行为并显示您可以使用以下方法添加解决方法:
{{1}}