如何利用按键绑定作为按键侦听器的替代方案
而不是依赖 KeyListeners 来使屏幕上的对象能够响应用户按键输入时,请考虑利用键绑定来增强响应能力。
键绑定比KeyListeners:
消除对焦点的需要:
与 KeyListeners 不同,键绑定允许对象响应输入,无论它们是否具有焦点。这消除了用户必须单击对象才能触发其功能的意外行为。
方便的维护和灵活性:
按键绑定简化了用户输入操作的管理和自定义。重新绑定、禁用或为按键分配新操作变得毫不费力,从而提高了代码的可读性和可维护性。
按键绑定的功能:
按键绑定包含两个组件:InputMap 和 ActionMap 。 InputMap 将用户输入(如按键)与操作名称相关联。然后,ActionMap 将操作名称链接到特定操作。当用户按下某个键时,InputMap 会识别相应的操作名称,ActionMap 会执行相关操作。
实现按键绑定:
要实现按键绑定,映射用户输入使用以下语法的操作:
myComponent.getInputMap().put("userInput", "myAction"); myComponent.getActionMap().put("myAction", action);
示例代码:
这是原始问题中提供的代码的修订版本,利用键绑定:
import javax.swing.*; import java.awt.event.*; public class MyGame extends JFrame { private static final int IFW = JComponent.WHEN_IN_FOCUSED_WINDOW; private static final String MOVE_UP = "move up"; private static final String MOVE_DOWN = "move down"; private static final String FIRE = "move fire"; static JLabel obj1 = new JLabel(); static JLabel obj2 = new JLabel(); public MyGame() { // ... GUI layout and management ... obj1.getInputMap(IFW).put(KeyStroke.getKeyStroke("UP"), MOVE_UP); obj1.getInputMap(IFW).put(KeyStroke.getKeyStroke("DOWN"), MOVE_DOWN); obj1.getInputMap(IFW).put(KeyStroke.getKeyStroke("control CONTROL"), FIRE); obj2.getInputMap(IFW).put(KeyStroke.getKeyStroke("W"), MOVE_UP); obj2.getInputMap(IFW).put(KeyStroke.getKeyStroke("S"), MOVE_DOWN); obj2.getInputMap(IFW).put(KeyStroke.getKeyStroke("T"), FIRE); obj1.getActionMap().put(MOVE_UP, new MoveAction(1, 1)); obj1.getActionMap().put(MOVE_DOWN, new MoveAction(2, 1)); obj1.getActionMap().put(FIRE, new FireAction(1)); obj2.getActionMap().put(MOVE_UP, new MoveAction(1, 2)); obj2.getActionMap().put(MOVE_DOWN, new MoveAction(2, 2)); obj2.getActionMap().put(FIRE, new FireAction(2)); // ... Remaining GUI setup ... } static void rebindKey(KeyEvent ke, String oldKey) { // ... Handle key rebinding ... } public static void main(String[] args) { new MyGame(); } private class MoveAction extends AbstractAction { // ... Action details ... } private class FireAction extends AbstractAction { // ... Action details ... } }
通过将 InputMap 与 ActionMap 分离,您可以增强代码的可重用性并获得更精细的控制超过键绑定。此外,可以独立启用或禁用操作,从而提供更大的灵活性。
您可以根据您的具体要求和项目目标进一步完善代码。
以上是为什么使用按键绑定而不是按键侦听器来增强应用程序的响应能力?的详细内容。更多信息请关注PHP中文网其他相关文章!