2013-04-17 48 views
0

我即將在數字鍵盤的回車應用程序中使用鍵盤綁定鍵,但難以捕獲密鑰。 我見過的所有示例依賴於類似
key == KeyEvent.VK_KP_LEFT如何定義數字鍵盤的keyStroke - 輸入密鑰

其中VK_KP_LEFT是一些預定義的價值。其他選項是這樣定義一個keystoke:
KeyStroke.getKeyStroke("control A");
KeyStroke.getKeyStroke(KeyEvent.VK_A, InputEvent.CTRL_MASK);

,但我還沒有找到小鍵盤上的「修改」。

什麼是容易獲得的,一般和之間的差異小鍵盤輸入: 全數字鍵盤,鍵(自主承擔,如果切換在數字模式或無法)分配
getKeyLocation() == 4
(我spottetd這從鍵按下/釋放鍵的方法)

的問題是:
如何正確地準備數字鍵盤迴車鍵在
inputMap.put(KeyStroke keyStroke, Object actionMapKey)
密鑰綁定方法來使用它的擊鍵?

感謝,
塔裏克

回答

2

如果您正在尋找結合輸入鍵就可以使用KeyEvent.VK_ENTER,即:

getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), "someAction"); 
getActionMap().put("someAction", someAction); 

下面是一個簡單的例子:

import java.awt.event.*; 
import javax.swing.*; 

public class Test { 
    public static void main(String[] args) throws Exception { 
     final JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     JPanel panel = new JPanel(); 
     panel.add(new JLabel("Hit Enter")); 

     Action someAction = new AbstractAction() { 
      public void actionPerformed(ActionEvent e) { 
       JOptionPane.showMessageDialog(frame, "Got it"); 
      } 
     }; 

     panel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(
       KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), "someAction"); 
     panel.getActionMap().put("someAction", someAction); 

     frame.add(panel); 

     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 
} 

編輯: VK_ENTER在數字鍵盤vs主鍵盤上

經過一些測試,看起來好像不可能分別綁定這些鍵。 對於兩個密鑰都會生成相同的KeyStrokeJComponent.processKeyBinding的執行沒有檢查KeyEvent,所有它關心的是KeyStroke以便找到所需的操作。

SwingUtilities.notifyAction即負責調度的實際行動不委託KeyEvent(只有關鍵,修飾和時間)的所有細節。所以在內部行動中,無法區分ActionEvent中沒有細節。

如果值得遇到麻煩,您可以覆蓋processKeyBinding並根據需要添加一些邏輯。您還可以使用KeyboardFocusManageraddKeyEventDispatcher()來阻止其中一個密鑰。

+2

雖然在技術上是正確的,因爲它應該既應對輸入鍵,相信OP要限制行動只是小鍵盤迴車鍵 – MadProgrammer

+0

@MadProgrammer真的,我可能誤解的問題。可能無法區分這兩個鍵。我想知道OP是否能提供更多細節。 – tenorsax

-1

這個怎麼樣?

if(keyEvent.getKeyLocation() == KeyEvent.KEY_LOCATION_NUMPAD 
&& keyEvent.getKeyCode() == KeyEvent.VK_ENTER) 
+5

尊重,這不是問題是關於密鑰監聽器,它關於密鑰綁定,它不可能確定密鑰被激活時KeyEvent的位置 – MadProgrammer

+1

感謝您的幫助。看起來,很難僅與numpad_enter完全綁定。目前,我不確定是否值得花費昂貴的解決方案或將設計更改爲關鍵聽衆。最後,代碼應該符合要求,不應該比所需要的更難:-)。乾杯,塔裏克 – tarik

+0

很高興我可以幫助:) –