2010-04-24 88 views
3

我想編寫兩個JList(類別和項目)。當我點擊一個類別時,應該選擇該類別的所有項目,當我點擊一個項目時,應該選擇它的類別。所以JList將有一個ListSelectionListener相互傾聽並更改選擇。java Swing監聽器:組件互相監聽

我是否應該擔心某種「迴路」?有沒有辦法說明事件已被消耗?人們如何處理這種情況?

謝謝

回答

1

如你想象,每次進行選擇上listA,你會觸發一個ListSelectionEvent要對你的聽衆燒成listA,他們的工作是找到listB所有適當的項目進行選擇。強制選擇然後listB將觸發事件由您的listB監聽器處理。這將依次在listA上強制選擇。簡單地使用兩個聽衆並不能解決問題。

我看到兩個選項:

1 - 使用一個單一的監聽器。該聽衆需要使用ListSelectionEvent上的getSource方法來測試事件的來源。如果源爲listB,請將您的聽衆從listA的聽衆列表中刪除,然後強行選擇listA,然後再讀取。

list1.removeListSelectionListener(this); 
list1.setSelectedIndex(e.getFirstIndex()); //this would have to be played with to allow for intervals 
list1.addListSelectionListener(this);` 

2 - 使用兩個監聽器,但是,爲了避免循環,您需要在嘗試選擇它之前測試該項是否已被選中。如果它已被選中,不要重新選擇它。

0

兩位聽衆是如何做到這一點的好方法,不用擔心。只要確保你只創建偵聽器一次,而不是循環。

-1

檢查你的焦點在哪裏。如果偵聽器偵聽組件A並且焦點不在A上,則不要更新其他組件,因爲A不是用戶更改的組件。

+0

沒有焦點不是一個好標誌(f.i.選擇可能會發生編程...) – kleopatra 2012-11-27 15:01:47

+0

不在他的情況。我認爲依靠重點是一個很好的方式來實現這一點,沒有任何不必要的開銷。他在談論「在comp X中做某件事」=>「更新Y」。他沒有提及以編程方式更改這些組件。 – Timmos 2012-11-27 16:47:52

+0

聳聳肩 - 你可以自由地堅持你的錯誤,畢竟這將是_your_痛苦時,遭受代碼如此短視的後果;-) – kleopatra 2012-11-27 17:00:13