java - 按下的按键相当于键入的按键

标签 java swing keyboard

当我尝试实现KeyEventDispatcher时,我遇到了一个小问题。按住键盘上的任意键都会导致 QuestGUI 在 true 和 false 之间切换。这意味着它会在每次执行时检查是否按下了该键。我想要的是,当我按“A”时,它将触发一个事件供我的 KeyEventDispatcher 处理。然后它应该等到按下下一个键。我的代码如下所示。

测试.java

package core;

import java.awt.KeyboardFocusManager;
import javax.swing.JFrame;

public class Test
{
    public Test (){
        JFrame frame = new JFrame ();        
        frame.setResizable (false);
        frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo (null);
        frame.pack ();
        frame.setSize (800, 600);        
        frame.setVisible (true);

        KeyboardFocusManager manager = KeyboardFocusManager.getCurrentKeyboardFocusManager();
        manager.addKeyEventDispatcher(new KeyManager());
    }

    public static void main (String[] args){
        new Test();
    }
}

KeyManager.java

package core;

import java.awt.KeyEventDispatcher;
import java.awt.event.KeyEvent;

public class KeyManager implements KeyEventDispatcher {

    private boolean QuestGUI;

    @Override
    public boolean dispatchKeyEvent(KeyEvent e) {
        if (e.getID() == KeyEvent.KEY_PRESSED) {
            QuestGUI = !QuestGUI;
            System.out.println("QuestGUI" + QuestGUI);
        }
        return false;
    }
}

可以通过添加一个 boolean 值来检查 Q 是否被按下来解决,只有当 Q 被释放时它才会起作用。就像PRESSED_Q。然后我需要每个键绑定(bind)并与之匹配。然而,这感觉很笨拙。我预计 KEY_PRESSED 会自动执行此操作。

最佳答案

就我个人而言,我更喜欢对这种事情使用键绑定(bind),这只是我的想法,但是您可以创建两个 Action,一个用于按下,一个用于释放,这只需一个“键” ” value 会将某种 Map 中的值(即 "Up")设置为 true/false 取决于触发器,但这就是我......

核心问题是,KEY_PRESSED 事件将根据操作系统定期重复。这意味着您的 QuestGUI 值会不断翻转。您需要检测 KEY_PRESSEDKEY_RELEASED 事件并采取适当的操作,例如...

public class KeyManager implements KeyEventDispatcher {

    private boolean QuestGUI;

    @Override
    public boolean dispatchKeyEvent(KeyEvent e) {
        if (e.getID() == KeyEvent.KEY_PRESSED && !QuestGUI) {
            QuestGUI = true;
            System.out.println("QuestGUI" + QuestGUI);
        } else if (e.getID() == KeyEvent.KEY_RELEASED && QuestGUI) {
            QuestGUI = false;
            System.out.println("QuestGUI" + QuestGUI);
        }
        return false;
    }
}

您还可以使用 KeyEvent#getKeyCode 值,将其放置在 ListMap 中来检测何时按下/释放某些按键...

就我个人而言,我认为按键绑定(bind)会更容易管理、扩展和配置,但我想这一切都取决于上下文。

关于java - 按下的按键相当于键入的按键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28531349/

相关文章:

java - 执行 Cucumber 测试时 Spring Boot 休息服务关闭

java - 使用 ASM 访问 Java Stack 中的第二个顶级对象

java - 在现有饼图下方添加折线图

apache-flex - 弹性 : Simulate key press

android - 使用 Delphi 10.3 在 Android 应用程序中隐藏虚拟键盘

java - 在表格单元格中添加图标+容器数据

java - 尝试从 Google 相册应用中选择照片时出现 IllegalStateException

java - 在 JTextPane 中定位图像(就像使用 setBounds 在 JFrame 中定位 JPanel)

java - Jpanel 和图形错误

c++ - 无法使用::SendInput() 将退格键发送到写字板应用程序