JComponent类里提供的getInputMap()方法返回一个InputMap对象,该对象用于将KeyStroke对象(代表键盘或其他类似输入设备的一次输入事件)和名字关联;getActionMap()方法返回一个ActionMap对象,该对象用于将指定名字和Action(Action接口是ActionListener的子接口,可作为一个事件监听器使用)关联,从而可以允许用户通过键盘操作来代替鼠标驱动GUI上的Swing组件,相当于为GUI组件提供快捷键。典型用法如下:
//把一次键盘事件和一个aCommand对象关联
component.getInputMap().put(aKeyStroke,aCommand);
//将aCommand对象和一个Action事件响应关联
component.getActionMap().put(aCommand,anAction);
再看下面程序:
import javax.swing.*;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class TestBindKey
{
JFrame jf=new JFrame("测试");
JTextArea ta=new JTextArea(3,30);
JButton bt=new JButton("发送");
JTextField tf=new JTextField(15);
public void init()
{
jf.add(ta);
JPanel jp=new JPanel();
jp.add(tf);
jp.add(bt);
jf.add(jp,BorderLayout.SOUTH);ActionListener sendMsg=new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
ta.append(tf.getText()+"\n");
tf.setText("");
}
};bt.addActionListener(sendMsg);
//将Ctrl+Enter键和“send”关联
tf.getInputMap().put(KeyStroke.getKeyStroke('\n',java.awt.event.InputEvent.CTRL_MASK),"send");
//将"send"和sendMsg Action关联
tf.getActionMap().put("send",sendMsg);
jf.pack();
jf.setVisible(true);
}
public static void main(String[] args)
{
new TestBindKey().init();
System.out.println("Hello World!");
}
}上面的程序实现了一个功能:用户在单行文本框内输入内容,当用户输入完成之后,单击后面的“发送”按钮即可将文本框中的内容添加到一个多行文本域中;或者输入完成后在文本框内单击Ctrl+Eneter也可以将文本框的内容添加到多行文本域中。相当于为“发送”按钮添加了“Ctrl+Enter”快捷键。