簡體   English   中英

Java中的按鍵綁定與按鍵監聽器

[英]Key bindings vs. key listeners in Java

我注意到,在Java / Swing中,似乎至少有兩種不同的方法來處理關鍵事件:

兩者的優點/缺點是什么?何時應該選擇一個而不是另一個?

什么時候應該選擇一個而不是另一個?

自引入鍵綁定以來,首選鍵綁定。 KeyListener是具有事件的較低級別的連接。

關於鍵綁定的頁面涵蓋了很多我傾向於使用它們而不是使用KeyListener 它列出了很多對於KeyListener “不可用”的東西。 EG的選擇:

  • WHEN_FOCUSED
  • WHEN_ANCESTOR_OF_FOCUSED_COMPONENT
  • WHEN_IN_FOCUSED_WINDOW

我閱讀鏈接文檔的次數越多,對所提問題的理解就越少。 例如:

鍵綁定的替代方法是使用鍵偵聽器。 按鍵偵聽器是鍵盤輸入的低級接口,但是對於響應單個按鍵,按鍵綁定更為合適,並且往往會導致代碼維護更加容易。 如果要在組件沒有焦點時激活鍵綁定,則鍵偵聽器也很困難。 按鍵綁定的一些優點是它們可以自我記錄,可以考慮容納層次結構,鼓勵可重用的代碼塊( Action對象),並允許輕松地刪除,自定義或共享操作。 而且,它們使更改動作綁定的鍵變得容易。 Actions另一個優點是它們具有啟用狀態,該狀態提供了一種輕松的方式來禁用該動作而不必跟蹤其附加到哪個組件。

文字成分

如@Robin所述,文本組件還具有DocumentListenerDocumentFilter ,可以添加它們以提供更適合文本文檔的功能。 有關文檔偵聽 過濾器的更多信息,請參見文本組件功能

  1. 按鍵綁定(高度抽象)

好處

  • 可設置,可共享,

  • 指定用於簡單的快捷方式,沒有不必要的副作用(大多數事件非常簡單且可設置)

  • 輕松解決窗口焦點問題(也可以設置,請確保在Java中窗口必須焦點在屏幕上)

  • 在內部擺動以使用@camickr的按鍵綁定中的鍵綁定 ,內置快捷鍵,操作 (在Swing中實現了有趣的快捷鍵和操作)

  • 輸出應該是Swing Action(Swing中相同的可能的高抽象度)

缺點

  • 無法覆蓋鍵盤上的所有鍵

  • 無法覆蓋同時按下三個或更多鍵

  • 代碼看起來非常復雜(一點都不是真的,與來自KeyListener的相同代碼相比,大多數情況下代碼是排序器)

  • 已刪除以獲取更多詳細信息,以查看@camickr的常用命令 (重復操作需要Swing計時器)

  • 使用API​​中實現的一種方法無法使用Consumption()

KeyListeners(低級偵聽器)


好處

  • 非常易於使用,直觀

  • 一兩個關鍵事件的代碼很短

  • 不需要任何有關Swing,Java的知識

  • 可能會覆蓋樹或按下更多鍵(例如),對於非常復雜的快捷鍵,那么哪個人可以觸發任何單獨的鍵事件都沒有關系

  • 可以通過編程方式到event.consume()

  • 可以監聽來自復合JComponents(JComboBox,JSpinner ...)的未完成的內部事件

缺點

  • 不適用於部分容器和JComponents

  • (J)組件應該是焦點所有者,並且必須是可焦點的

  • 沒有為Swing JComponents指定

AWTEventListener


  • 組合所有Key和Mouse事件,以及Java中可能的低層偵聽器

  • 基本上沒有理由針對大多數基於Swing的GUI(甚至非常復雜)使用此偵聽器

  • 我看到此偵聽器在基於AWT的自定義組件中實現,所需對等體來自本機操作系統

  • 但是@camickr提供了AWTEventListener 應用程序不活動和全局事件監聽器的出色實現

注意:關鍵事件的順序因平台而異


暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM