1

我正在尝试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再次点击

这是我得到的打印输出:

srcFruit = Orange and destFruit = Pear
srcFruit = Orange and destFruit = Pear

我在哪里错了?是getFirstIndex()/ getLastIndex()buggy 还是不是正确的 Swing 方法?

这是我应该看到的输出:

srcFruit = Orange and destFruit = Pear
srcFruit = Pear and destFruit = Orange

因此,即使我进行了 3 次选择(鼠标单击),由于我第一次单击Orange并没有从一个值更改为下一个值,我相信不触发和调用是正确的printSourceAndDestFruit。I select Pearand it is correct in statement that srcFruitis Orangeand that destFruitis Pear. 但是当我点击回到Orange第二个 println 应该有srcFruitasPeardestFruitas Orange为什么不呢?!?!

提前致谢!

4

2 回答 2

3

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

获取第一索引()

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

获取上一个索引()

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

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

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

于 2012-12-15T00:07:36.233 回答
1

选择在 order 中的原因是Orange调用PearfireValueChangedDefaultListSelectionModel基于项目索引位置ListModel而不是新的选择索引。

这个相关的错误报告提出了一个类似的问题,但表明这是正常行为,并表明您可以使用以下方法添加解决方法:

FruitVO srcFruit = (FruitVO)list.getModel().getElementAt(list.getMinSelectionIndex());
FruitVO destFruit = (FruitVO)list.getModel().getElementAt(list.getMaxSelectionIndex());
于 2012-12-15T03:51:02.780 回答