12.2.4 Swing组件的双缓冲和键盘驱动
12.2.4 Swing组件的双缓冲和键盘驱动
除此之外,Swing
组件还有如下两个功能:
- 所有的
Swing
组件默认启用双缓冲绘图技术。 - 所有的
Swing
组件都提供了简单的键盘驱动。
Swing
组件默认启用双缓冲绘图技术,使用双缓冲技术能改进频繁重绘GUI
组件的显示效果(避免闪烁现象)。JComponent
组件默认启用双缓冲,无须自己实现双缓冲。如果想关闭双缓冲,可以在组件上调用setDoubleBuffered(false)
方法。前一章介绍五子棋游戏时已经提到Swing
组件的双缓冲技术,而且可以使用JPanel
代替前一章所有示例程序中的Canvas
画布组件,从而可以解决运行那些示例程序时的“闪烁”现象。
JComponent
类提供了getInputMap()
和getActionMap()
两个方法,其中
方法 | 描述 |
---|---|
getInputMap() |
返回一个InputMap 对象,该对象用于将KeyStroke 对象和名字关联,KeyStroke 代表键盘或其他类似输入设备的一次输入事件; |
getActionMap() |
返回一个ActionMap 对象,该对象用于将指定名字和Action 关联,Action 接口是ActionListener 接口的子接口,可作为一个事件监听器使用,从而可以允许用户通过键盘操作来替代鼠标驱动GUI 上的Swing 组件,相当于为GUI 组件提供快捷键。 |
典型用法如下:
//把一次键盘事件和一个aCommand象关联 component.getInputMap().put(aKeystroke,aCommand); //将 command对象和anAction事件响应关联 component.getActionMap().put(aCommmand,anAction);
程序 Swing快捷键
下面程序实现这样一个功能:用户在单行文本框内输入内容,当输入完成后,单击后面的“发送”按钮即可将文本框的内容添加到一个多行文本域中;或者输入完成后在文本框内按“Ctrl+Enter
”键也可以将文本框的内容添加到一个多行文本域中。
1 | import java.awt.*; |
上面程序中的代码:
// 将Ctrl+Enter键和 字符串"send" 关联 jTextField.getInputMap().put(KeyStroke.getKeyStroke('\n', java.awt.event.InputEvent.CTRL_DOWN_MASK), "send"); // 将 字符串 "send" 和sendMsg这个Action关联 jTextField.getActionMap().put("send", sendMsg);
示范了如何利用键盘事件来驱动Swing
组件,采用这种键盘事件机制,无须为Swing
组件绑定键盘监听器,从而可以复用按钮单击事件的事件监听器,程序十分简洁。