我的自定義組件由JPanel
中的三個JTree
組成。一次只能選擇一個JTree
,所以我爲其中的每個人添加了一個TreeSelectionListener
,它們在先前選擇的JTree
上調用clearSelection
。Swing:自定義組件上的聽衆執行順序
我想添加其他TreeSelectionListener
s到JTree
s確保選擇處理偵聽器總是首先執行。我不想把所有內容都放在一個TreeSelectionListener
之內。
我應該怎麼辦?提前致謝!
我的自定義組件由JPanel
中的三個JTree
組成。一次只能選擇一個JTree
,所以我爲其中的每個人添加了一個TreeSelectionListener
,它們在先前選擇的JTree
上調用clearSelection
。Swing:自定義組件上的聽衆執行順序
我想添加其他TreeSelectionListener
s到JTree
s確保選擇處理偵聽器總是首先執行。我不想把所有內容都放在一個TreeSelectionListener
之內。
我應該怎麼辦?提前致謝!
也許你可以通過添加新的偵聽器到現有的偵聽器來進行鏈接,這樣當下一次你的偵聽器被調用時,它將依次將事件轉發給它的偵聽器。
// This is your current listener implementation
class CustomTreeSelectionListener implements TreeSelectionListener {
// listeners to which the even will be forwarded
private List<TreeSelectionListener> ownLIsteners;
public void addListener(TreeSelectionListener newListener) {
ownListeners.add(newListener);
}
// add also removeListener(.... )
// TreeSelectionListener interface implementation...
public void valueChanged(TreeSelectionEvent e) {
process(e); // do what you do now
// Forward the message.
for(TreeSelectionListener listener : ownListeners) {
listener.valueChanged(e);
}
}
}
不是一個很好的解決方案,但可以將代碼包裝在SwingUtilities.invokeLater(...)中。這會將代碼添加到EDT的末尾,這意味着它將在其他偵聽器代碼執行後最終執行。
謝謝,這是一個很好的解決方案!我不知道我怎麼沒有得到它之前:) BTW我有一個新的問題:/(http://stackoverflow.com/questions/1466042/swing-how-can-i-ignore-deselection-events) – Giuseppe 2009-09-23 13:37:08
我很高興這很有幫助。也許是因爲有時候我們太集中於一個問題的觀點,我們沒有看到其他的選擇。這經常發生在我身上。有時我們只需要一個不同的觀點。 – OscarRyz 2009-09-23 15:21:44