我想編寫兩個JList(類別和項目)。當我點擊一個類別時,應該選擇該類別的所有項目,當我點擊一個項目時,應該選擇它的類別。所以JList將有一個ListSelectionListener相互傾聽並更改選擇。java Swing監聽器:組件互相監聽
我是否應該擔心某種「迴路」?有沒有辦法說明事件已被消耗?人們如何處理這種情況?
謝謝
我想編寫兩個JList(類別和項目)。當我點擊一個類別時,應該選擇該類別的所有項目,當我點擊一個項目時,應該選擇它的類別。所以JList將有一個ListSelectionListener相互傾聽並更改選擇。java Swing監聽器:組件互相監聽
我是否應該擔心某種「迴路」?有沒有辦法說明事件已被消耗?人們如何處理這種情況?
謝謝
如你想象,每次進行選擇上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 - 使用兩個監聽器,但是,爲了避免循環,您需要在嘗試選擇它之前測試該項是否已被選中。如果它已被選中,不要重新選擇它。
看看Beans Binding API。這裏是NetBeans的tutorial。
兩位聽衆是如何做到這一點的好方法,不用擔心。只要確保你只創建偵聽器一次,而不是循環。
檢查你的焦點在哪裏。如果偵聽器偵聽組件A並且焦點不在A上,則不要更新其他組件,因爲A不是用戶更改的組件。
沒有焦點不是一個好標誌(f.i.選擇可能會發生編程...) – kleopatra 2012-11-27 15:01:47
不在他的情況。我認爲依靠重點是一個很好的方式來實現這一點,沒有任何不必要的開銷。他在談論「在comp X中做某件事」=>「更新Y」。他沒有提及以編程方式更改這些組件。 – Timmos 2012-11-27 16:47:52
聳聳肩 - 你可以自由地堅持你的錯誤,畢竟這將是_your_痛苦時,遭受代碼如此短視的後果;-) – kleopatra 2012-11-27 17:00:13