2012-12-14 17 views
1

我想爲JList寫一個ListSelectionListener,它知道用戶正在選擇哪個列表項,以及用戶正在選擇哪個列表項。所以,如果列表中有{Apple, Orange, Pear}三個項目,目前的選擇是在Orange和用戶選擇Pear,則:如何獲取Swing ListSelectionEvent的「源」項?

  • 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()馬車或只是不正確的Swing方法使用?

這裏的輸出我應該看到:

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

所以,即使我做了3選擇(鼠標點擊),因爲我第一次點擊Orange是不是從一個值變化到下一個,我相信這是正確的不開火,並呼籲printSourceAndDestFruit。我選擇Pear並且說明srcFruitOrange並且destFruitPear是正確的。但是當我點擊返回到Orange時,第二個println應該有srcFruit作爲PeardestFruit作爲Orange爲什麼不呢?!?!

在此先感謝!

回答

3

第一個和最後一個索引不是你認爲的那樣。這裏的javadoc中這樣說:

getFirstIndex()

返回的第一行,其選擇可能已經改變的指標。

getLastIndex()

返回的最後一排,其選擇可能已經改變的指標。

因此,由於梨和桔子的變化,在每一次點擊的選擇,以後由於黃花梨是橙色在列表中,getFirstIndex()總是返回Orange和getLastIndex()總是返回梨。

如果您想比較新選擇與最後一個選擇,然後將最後一個選擇保留在某個成員變量中,並在每次選擇更改時將其與新選擇進行比較,並且getValueIsAdjusting()返回false。

1

之所以選擇順序OrangePear是,DefaultListSelectionModel電話fireValueChanged僅僅基於ListModel,而不是新選擇索引項目索引位置。

此相關bug report問過類似的問題,但表示這是正常的行爲,並表明你可以通過添加一個解決方法:

FruitVO srcFruit = (FruitVO)list.getModel().getElementAt(list.getMinSelectionIndex()); 
FruitVO destFruit = (FruitVO)list.getModel().getElementAt(list.getMaxSelectionIndex());