当前位置: 首页 > 知识库问答 >
问题:

使Java中的KeyEvent只发生一次,即使key被持有

阎功
2023-03-14
if(e.getKeyCode() == KeyEvent.VK_A)
{
   attack = true;
   moveX = -5;
   draw(moveX, moveY);
   players.get(username).setImageIcon("attack-left"); 
}

共有1个答案

禄和宜
2023-03-14

这样做的一种方法是将按下的最后一个键保存到字段中。然后,如果当前按下的键与上次按下的键相同,则不要执行任何操作。打开钥匙,清理场地。

下面是一些示例代码:

package com.sandbox;

import javax.swing.JFrame;
import javax.swing.WindowConstants;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.IOException;

public class SwingSandbox {

    private static Character lastKey = null;

    public static void main(String[] args) throws IOException {
        JFrame frame = buildFrame();
        frame.addKeyListener(new KeyListener() {
            @Override
            public void keyTyped(KeyEvent e) {
                if (lastKey == null || lastKey != e.getKeyChar()) {
                    lastKey = e.getKeyChar();
                    System.out.println("keyTyped: " + lastKey);
                }
            }

            @Override
            public void keyPressed(KeyEvent e) {
                if (lastKey == null || lastKey != e.getKeyChar()) {
                    lastKey = e.getKeyChar();
                    System.out.println("keyPressed: " + lastKey);
                }
            }

            @Override
            public void keyReleased(KeyEvent e) {
                lastKey = null;
                System.out.println("keyReleased");
            }
        });

    }

    private static JFrame buildFrame() {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.setSize(200, 200);
        frame.setVisible(true);
        return frame;
    }


}

尽管@schmop的评论说了什么,但我没有经历过这种情况。使用以下代码:

package com.sandbox;

import javax.swing.JFrame;
import javax.swing.WindowConstants;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.IOException;

public class SwingSandbox {

    public static void main(String[] args) throws IOException {
        JFrame frame = buildFrame();
        frame.addKeyListener(new KeyListener() {
            @Override
            public void keyTyped(KeyEvent e) {
                System.out.println("keyTyped");
            }

            @Override
            public void keyPressed(KeyEvent e) {
                System.out.println("keyPressed");
            }

            @Override
            public void keyReleased(KeyEvent e) {
                System.out.println("keyReleased");
            }
        });

    }

    private static JFrame buildFrame() {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.setSize(200, 200);
        frame.setVisible(true);
        return frame;
    }


}
 类似资料:
  • 我已经检查了以下代码片段: 这个代码不是我的。我知道在本例中使用不是正确的选择,在本例中我应该使用而不是,但这不是我现在关心的问题。 我认为方法将在

  • 好的,伙计们。我正在尝试创建一个小费计算器,我遇到了一些问题。问题是当用户输入一个值时,程序会询问(禁用enter按钮)用户是否希望包含提示,因此用户选择是或否。如果选择了其中任何一个,前面的问题就消失了,文字出现“小费包括在内”或“小费不包括在内”。现在,如果用户想要编辑上面的值,按钮将再次被启用,但是如果它点击了一个,它将再次询问用户是否想要包含提示。所以我的问题是,我怎样才能使它使它,无论那

  • 问题内容: 我正在使用Java Robot类发送键事件。我尝试了功能。但是我不知道如何发送+ keyEvent。 问题答案:

  • 我正在自动关闭学校网络中的计算机。到目前为止,我有一个批处理文件,它工作得很好,我想把它安排在每天特定的时间运行,但偶尔我可能想跳过任务,只是一天,而不是永久禁用它。 我发现了大量关于使用cmd创建、修改、禁用和删除计划任务的信息,但我没有发现任何关于跳过它们的信息...鉴于我不是唯一一个有时不得不跳过任务的人,所以使用批处理文件跳过任务是非常重要的,这样稍微不太懂计算机的人就不必摆弄任务调度器。

  • 我尝试只打印一次不同的整数值,即使它们在具有引入顺序的数组中重复多次。首先,我需要从用户获取数组大小,但我无法确定如何初始化该变量。我可以使用n(包含在代码中)作为数组大小变量吗?当我编译时,我不打印任何东西。我的错误在哪里?如何处理?有什么想法吗? }

  • 我试图让语法高亮在我正在制作的文本编辑器中工作,它现在高亮了[一些不正确的事情,但现在不重要]使用Pygments和显然是tkinter。问题是,当我运行它,即使只有一次,它是非常慢,我的笔记本电脑很便宜,所以这显然是一个因素,但vim,IDLE等运行就好。 我读过一些关于慢高亮显示的帖子,但这些只是为了何时更新,比如说,在每个单词之后,不要更新。我的问题是只运行一次语法高亮显示,它会滞后。 以下