Java KeyListener "object update"

标签 java swing keylistener

我有一个名为 KeyboardKeyListener 类,它实现了 KeyListener 的方法。

按键可以有 4 个状态(UP、ISUP、DOWN、ISDOWN),所有状态都表示它们是否处于关闭状态,或者刚刚处于关闭状态。

在每次更新键盘之前,我想将所有UP更改为ISUPSDOWN s 到 ISDOWNs。

Keyboard 类上有一个 Update 方法,但我不知道何时调用它(因为 addKeyListener() 函数似乎很神奇,只是无需调用任何函数即可工作[可能启动一个线程])

我如何知道何时调用 Update 方法? (就在键盘即将触发事件之前)

这是 Keyboard 类本身:

package game.input;

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.HashMap;
import java.util.Map;

enum KeyStatus
{
    DOWN, ISDOWN, UP, ISUP
}

public class Keyboard implements KeyListener
{
    private Map<Character, KeyStatus> keys;

    public Keyboard()
    {
        keys = new HashMap<Character, KeyStatus>();

        for (int i = 0; i < 256; i++)
        {
            keys.put((char)i, KeyStatus.ISUP);
        }
    }

    public void update() //This should be called after every event loop (how?)
    {
        for (Map.Entry<Character, KeyStatus> ks: keys.entrySet())
        {
            if (ks.getValue() == KeyStatus.UP)
                keys.put(ks.getKey(), KeyStatus.ISUP);

            else if (ks.getValue() == KeyStatus.DOWN)
                keys.put(ks.getKey(), KeyStatus.ISDOWN);
        }
    }

    public boolean keyDown(char i)
    {
        return (keys.get(i) == KeyStatus.DOWN || keys.get(i) == KeyStatus.ISDOWN);
    }

    public boolean onKeyDown(char i)
    {
        return (keys.get(i) == KeyStatus.DOWN);
    }

    public boolean keyUp(char i)
    {
        return (keys.get(i) == KeyStatus.UP || keys.get(i) == KeyStatus.ISUP);
    }

    public boolean onKeyUp(char i)
    {
        return (keys.get(i) == KeyStatus.UP);
    }


    @Override
    public void keyPressed(KeyEvent key)
    {
        keys.put(key.getKeyChar(), KeyStatus.DOWN);
    }

    @Override
    public void keyReleased(KeyEvent key)
    {
        keys.put(key.getKeyChar(), KeyStatus.UP);
    }

    @Override
    public void keyTyped(KeyEvent key)
    {
    }

}

最佳答案

KeyListener 注册到组件,当某种 KeyEvent 发生时,EventQueue 会通知该组件。 EventQueue 通过直接与操作系统/ native 层绑定(bind)的特定于平台的机制进行通知。

Swing 通常使用 observer pattern当谈到听众时。也就是说,您将一个监听器附加到一个组件,该组件会在发生某些情况时告诉您

您不应该“需要”调用任何方法来检查按键的状态。相反,当触发 KeyEvent 时,KeyListener 将收到通知(通过事件链)并通过 KeyListener 接口(interface)触发适当的事件。

KeyListener 需要向屏幕上可见的某个组件注册,可以获得键盘焦点并在事件发生时具有焦点。

看看How to write Key Listeners了解更多详情。

您还可以找到Introduction to Event Listeners有用。

KeyListener 遇到焦点问题(只有当前可聚焦/聚焦的组件才能接收 KeyEvents)。建议您使用Key Bindings相反。

已更新

经过一轮轮的讨论,我们找出了真正的问题是什么,我们得出的结论是,OP 正在尝试生成当前按下但已由游戏引擎处理的按键的屏蔽列表,以努力消除按键重复触发更多更新。

我们得出的结论是,OP 应该生成一个“已处理”且“Activity ”的 key 列表。

当触发按键事件时,键盘处理程序将检查该键是否存在于“已处理”列表中,如果存在,则忽略该键,否则将其放入 Activity 列表中。

当游戏引擎处理按键时,它会扫描“Activity ”列表,采取操作并将每个按键放在“已处理”列表中。

释放 key 后,它将从已处理列表中删除。

关于Java KeyListener "object update",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16430088/

相关文章:

java - 我们可以更改移动设备的 GPS 值吗?

java - 如何避免/抑制 JSF <h :selectOneMenu/> null (no selection option) tab?

Applet 和 Java 7 中的 JavaFX - 可能吗?

java - 如何从 JFrame 中的文本框接收输入?

java - 将选项 Pane 放入字符串变量中

java - 设置插入符位置,其中插入符不在 JTextArea 中

java - KeyTyped 方法说 TextField 为空...但实际上不是

Eclipse 上的 Java 包名称编译问题

java - KeyListener 不能与 dispose() 一起使用;

java - 使用 Hibernate 加载表中的所有实体会导致应用程序崩溃