2016-08-01 48 views
0

我一直在試圖通過重寫我以前使用KeyListener解決的書中的問題來學習keybind。我正在努力解決使用keybinds的問題,需要我記錄已輸入的消息並將其顯示在面板上。Java Swing:KEY_TYPED事件的KeyBinding

使用KeyListener解決問題的方式就是使用keyTyped()方法通過unicodes記錄字符並使用keyPressed讀取修飾符/非Unicode密鑰。如果KeyEvent.VK_ENTER與keyevent中的鍵碼相匹配,則會在面板上顯示該字符串。

~~~~~~~~

我認爲它可以與KeyBinds類似的方式來解決。它在KeyEvent文檔中說每輸入一個字符時都會觸發KeyEvent.KEY_TYPED。我認爲這意味着每個字符都有相應的Unicode,就像它在KeyListener中的工作方式一樣。

後來,我意識到我不知道如何檢索字符,因爲KeyBinds上的Oracle教程指出,在調用actionPerformed()時會使用KeyEvent。

這是我認爲將使我使用鍵綁定記錄輸入鍵一個StringBuilder代碼:

getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.KEY_TYPED, 0), "recordTypedKey"); 
getActionMap().put("recordTypedKey", addCharToString); 

有沒有一種方法來獲得,將調用的KeyListener的的keyTyped()中的字符方法除了添加他們的每一個關鍵,並使用單獨的行動事件來記錄它們?

+0

鍵綁定用於映射指定一個Action的特定KeyStroke。我不會使用鍵綁定來偵聽所有可能的KeyStrokes。 '我正在努力解決使用keybinds的問題,需要我記錄一個已經鍵入的消息 - 也許你應該使用'DocumentListener'。這個監聽器可以添加到任何文本組件的「文檔」中。 – camickr

回答

2

有沒有一種方法來獲取除了向每個鍵添加鍵並使用單獨的Action事件來記錄KeyListener的keyTyped()方法外還會調用KeyListener的keyTyped()方法的字符?

我不相信有一個全局KeyStroke可以傳遞給InputMap中,將工作類似的KeyListener,作爲一個KeyBinding單獨密鑰基礎上開展工作。但是,您可以創建單個Action並通過循環遍歷您希望處理的char值來綁定鍵 - 在ActionListener實現中,您可以通過getActionCommand獲取該鍵的值。例如,爲了應對AZ:

AbstractAction action = new AbstractAction(){ 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     System.out.println(e.getActionCommand()); 
    } 

}; 
//loop over the ascii char values 
for (char a = 'A'; a <= 'Z'; a++){ 
    panel.getInputMap().put(KeyStroke.getKeyStroke(Character.toString(a)), "recordTypedKey"); 
} 
panel.getActionMap().put("recordTypedKey", action); 

如果需要,您可以添加改性劑......例如對付shift鍵(如大寫),

panel.getInputMap().put(KeyStroke.getKeyStroke("shift " + Character.toString(a)), "recordTypedKey");