有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

按java键作为键入的键

我在尝试实现KeyEventDispatcher时遇到了一个小问题。按住键盘上的任何键都会导致QuestGUI在真与假之间切换。这意味着它会检查每次执行时是否按下该键。我想要的是,当我按下“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();
    }
}

密钥管理器。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。然后我需要为每个键绑定和匹配它。然而,这感觉很笨拙。我希望KEY_PRESSED会自动执行此操作


共 (1) 个答案

  1. # 1 楼答案

    就我个人而言,我更喜欢对这类事情使用键绑定,这就是我,但是你可以创建两个Action,一个用于按下,另一个用于释放,它只需要一个“键”值,它会根据触发器将某种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中,以检测何时按下/释放某些键

    就我个人而言,我认为密钥绑定更易于管理、扩展和配置,但我想这一切都取决于上下文