如何获取Swing ListSelectionEvent的“源”项?

时间:2012-12-14 22:29:18

标签: java swing jlist listselectionlistener

我正在尝试为ListSelectionListener写一个JList,它知道用户正在选择哪个列表项,以及用户选择哪个列表项。因此,如果列表中包含三个项目{Apple, Orange, Pear},并且当前选择位于Orange且用户选择Pear,则:

  • srcFruitOrange;和
  • destFruitPear

这是我的代码:

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时,没有默认选择。当我采取以下行动时:

  1. 点击Orange
  2. 点击Pear
  3. 再次点击Orange
  4. 这是我得到的打印件:

    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,说明srcFruitOrangedestFruitPear是正确的。但是当我点击回Orange时,第二张println应该srcFruitPeardestFruitOrange为什么不呢?!?!

    提前致谢!

2 个答案:

答案 0 :(得分:3)

第一个和最后一个索引不是您认为的那样。以下是javadoc所说的内容:

  

getFirstIndex()

     

返回其选择可能已更改的第一行的索引。

     

getLastIndex()

     

返回其选择可能已更改的最后一行的索引。

因此,由于梨和橙的选择在每次点击时都会发生变化,并且由于梨在列表中位于橙色之后,因此getFirstIndex()始终返回橙色,getLastIndex()始终返回梨。

如果要将新选择与最后一个选择进行比较,则将最后一个选择保留在某个成员变量中,并在每次选择更改时将其与新选择进行比较,getValueIsAdjusting()返回false。

答案 1 :(得分:1)

选择的顺序为OrangePear的原因是DefaultListSelectionModelListModel根据FruitVO srcFruit = (FruitVO)list.getModel().getElementAt(list.getMinSelectionIndex()); FruitVO destFruit = (FruitVO)list.getModel().getElementAt(list.getMaxSelectionIndex()); 中的项目索引位置调用fireValueChanged而不是新的选择指数。

此相关bug report提出了类似的问题但显示这是正常行为并显示您可以使用以下方法添加解决方法:

{{1}}