2013-04-13 83 views
1

我一直在試圖學習如何在Java中使用鍵綁定。這是我迄今爲止的,但似乎沒有工作。當我按'w'時,應該打印出「你好!」。然而按'w'什麼也不做。鍵入綁定代碼不起作用

import java.awt.*; 
import java.awt.event.*; 
import java.net.*; 
import java.util.HashMap; 
import java.util.Map; 
import javax.swing.*; 

public class Space extends JPanel { 


    public static void createAndShowUI() { 
     JFrame frame = new JFrame("Space"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(new Space()); 
     frame.pack(); 
     frame.setVisible(true); 

     Action wKey = new AbstractAction() { 
     public void actionPerformed(ActionEvent e) { 
     System.out.println("Hello"); 
    };  
    }; 

     InputMap im = frame.getRootPane().getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); 
     ActionMap am = frame.getRootPane().getActionMap(); 
     im.put(KeyStroke.getKeyStroke("w"),"doSomething"); 
     am.put("doSomething", wKey); 


    } 



    public static void main(String[] args) { 
     java.awt.EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       createAndShowUI(); 
      } 
     }); 



    }} 

在此先感謝!

回答

3

1)你正在改變錯誤的InputMap:

//InputMap im = frame.getRootPane().getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); 
InputMap im = frame.getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW); 

2)你是正確創建的擊鍵。該字符串應包含使用KeyEvent_VK時找到的值?

所以在你的情況下,你可以使用「W」,它將映射到KeyEvent.VK_W。這將映射到「w」的keyPressed。

你也可以做事件的keyTyped綁定:

im.put(KeyStroke.getKeyStroke('w'),"doSomething"); // or 
im.put(KeyStroke.getKeyStroke("typed w"),"doSomething");