2011-03-11 80 views
2

addKeyListener,removeKeyListener,getKeyListeners或相關教程的文檔中,我可能會忽略一些有關此問題的明顯信息,但是對添加的按鍵偵聽器的運行順序有任何保證嗎?我的希望是它們按照它們被添加的順序運行,但是我不認爲這是在任何地方指定的。是否保證KeyListeners的調用順序?

我的情況是,我需要一個按鍵偵聽器添加到現有的Component並覆蓋現有的按鍵偵聽特定按鍵。看起來應該可以做到這一點:

  • 使用getKeyListeners找到所有現有的鍵盤記錄。
  • 刪除每個現有的密鑰偵聽器removeKeyListener
  • 使用addKeyListener添加我的密鑰偵聽器。 (這僅涉及選擇按鍵,並且消耗的時候情況確實如此。)
  • 最後加回所有與addKeyListener第一步驟中發現的主要聽衆。

但是我不想這樣做,如果事實證明,它不會在特定的JVM工作等

回答

4

我不太瞭解你的情況。依靠聽衆被調用的順序似乎對我來說有點狡猾。

難道你們就不能只建立在你的事件發生,其檢測的關鍵監聽包裝類,如果不是代表適當的情況下,以包裝的監聽器類(ES)?

我認爲,除非我誤解了某些東西,否則在不依賴於偵聽器排序的情況下,有更好的方法可以實現您想要實現的目標!

+0

謝謝,這是一個更好的主意。我不知道爲什麼我會根據訂單來執行此操作。我會試試:) – 2011-03-11 16:02:54

1

我不知道訂單是否有保證。

您可以稍微修改您的方法以使其在大多數情況下都能正常工作:按照原樣保留步驟1,2和3,但將關鍵偵聽器列表存儲在您的自定義關鍵字偵聽器中,並且不要將它們添加回Component的偵聽器。

在您的自定義偵聽器中,在每個方法中,在完成自己的處理之後,調用保存的偵聽器的方法。僞代碼:

void keyPressed(event) { 
    // do some magic 
    for (listener: savedListeners) 
    listener.keyPressed(event); 
} 
1

通過文檔閱讀後,好像是有保證KeyEvent旨意進行排隊,並順序處理。但它沒有提到KeyListener。對我來說,它推斷不會有這種保證,因爲每個聽衆都是作爲一個單獨的線程運行的。

所以,我會在這裏投票PhillMat's建議也不錯。

1

我的希望是它們按照添加的順序運行,但我沒有看到這是在任何地方指定的。

沒有順序無法得到保證。

我相信目前實施的順序是,所有聽衆(不僅僅是關鍵聽衆)按照相反的順序運行,並添加它們。

查看EventListenerList類,我相信這是用於實現此功能的類。

當然這很容易測試。您只需向您的組件添加幾個偵聽器,並讓每個偵聽器在調用時顯示一條消息。

+0

camickr:謝謝你的回答。關於測試行爲,我知道我可以確定它應該在我有權訪問的JVM上,但我想知道這是否可以依賴。但是,您確認它不是:) – 2011-03-11 16:44:18

相關問題