Java / Swing’de herhangi bir nesne üzerinde klavye aksiyonlarını yakalamak istiyorsanız bunun için bir kaç yol mevcut.
Birincisi ekleyerek bunu yapabilirsiniz. Bu sayede kullanıcının herhangi bir klavye aksiyonunu 3 farklı zaman diliminde yakalayabilirsiniz. Birincisi tuşa basılırken (key pressed), ikincisi tuş geri çekilirken (key released), son olarak da bu üçünün sonunda işlem tamamlanınca (key typed). Ancak keyTyped metodu içerisinde bazı kısıtlamalar mevcut. Mesela kombinasyon şeklindeki aksiyonları yakalayamazsınız (ctrl + a gibi). Diğer tüm bilgileri sınıfındaki dökümantasyonda bulabilirsniz.
İkinci çözüm olarak da, ilgili kontrole tuş aksiyonları bind edebilirsiniz. Bunun için kontrolün input map nesnesinebir klavye aksiyonunu bir anahtar ile kaydedip, action map nesnesine de bu anahtar ile aksiyon ekleyip gerçekleştirebilirsiniz. Örnek olarak;
component.getInputMap().put(KeyStroke.getKeyStroke("F2"), "doSomething");
component.getActionMap().put("doSomething", anAction);
//anAction implements javax.swing.Action
Bu çözüm, panel ya da diyalog gibi ekranlarda kullanılarak kullanıcının herhangi bir girdi giremeyeceği nesneler üzerinde etkili olur. Kullanıcıların klavye ile girdi girebileceği (JTextField ya da JTextArea gibi) nesnelerde birinci çözüm daha efektif olarak kullanılabilir.
Eğer ki üstteki iki çözümde size yeteri kadar yardım etmediyse, üçüncü çözüm olarak da aktif pencere üzerinden geçen tüm klavye aksiyonlarını yakalayabileceğiniz bir sınıf yazabilirsiniz. arayüzünden türeyen bir sınıf yazarak ve bu sınıfı metodu ile KeyboardFocusManager’a ekleyerek o andan sonra o pencere üzerinden geçen tüm klavye aksiyonlarını yakalayabilirsiniz. Bu çözümü kullanmak için yukarıdaki iki çözümünde sizin için işe yaramamış olmaması gerekmektedir. Zira bu çözüm oldukça düşük seviyeli bir çözüm olmakla beraber, bazı istenmeyen sonuçlara da yol açabilir. Çünkü klavye aksiyonu yukarıdaki iki örnekten de önce bu sınıftan geçecektir. Bu sınıftan geçtikten sonra yukarıdaki yöntemler ile işlenecektir. O yüzden siz bu seviyede aksiyonu consume KeyboardFocusManager.addKeyEventDispatcher()