首页 > Java > java教程 > 为什么使用按键绑定而不是按键侦听器来增强应用程序的响应能力?

为什么使用按键绑定而不是按键侦听器来增强应用程序的响应能力?

Mary-Kate Olsen
发布: 2024-12-19 03:50:09
原创
879 人浏览过

Why Use Key Bindings Instead of Key Listeners for Enhanced Responsiveness in Applications?

如何利用按键绑定作为按键侦听器的替代方案

而不是依赖 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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板