如何在Java中检测按键

Posted

技术标签:

【中文标题】如何在Java中检测按键【英文标题】:How to detect a key press in Java 【发布时间】:2014-03-25 01:32:53 【问题描述】:

我正在学习 Java 的儿子(11 岁)将输入一个问题和一些代码。他告诉我他无法在网站上找到这个问题的答案。您将阅读我对他的问题的编辑版本。非常感谢。

如何在 java 中检测按键,我的 IDE 称为 eclipse,我已经制作了一些类。我在互联网的 keyconfigofplayer 中找到了代码并将其更改为扩展播放器类。我想要它,所以当我按住一个键时,一个矩形或椭圆形会在屏幕上移动,我该怎么做?由于某种原因,它不会正确输入代码,这就是为什么我的导入没有星号并且看起来很奇怪。对于那个很抱歉。请忽略它。我无法解决这个问题:(。 这是我的代码:

窗口代码:

import javax.swing.*;
import java.awt.*;

public class window 

    public static void main(String[] args) 
        // TODO Auto-generated method stub
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setVisible(true);
        f.setSize(600, 600);
        player p = new player();
        f.add(p);

        keyconfigofplayer key = new keyconfigofplayer();
        p.add(key);
        f.add(key);

    


//this class is the player graphic

import javax.swing.*;
import java.awt.*;

    public class player extends JPanel 

    int x = 50;
    int y = 50;

    public void paint() //This is where the graphic is painted to the screen
        repaint();
    

    public void paintComponent(Graphics g) 
        //This is where the graphic is 'manufactured'
        super.paintComponent(g);
        g.setColor(Color.GREEN);
        int width = 20;
        int height = 20;
        g.fillRect(x, y, width, height);

        int width2 = 10;
        int height2 = 10;
        g.fillOval(x, y, width2, height2);

    


//the keyconfigofplayer class(where i think the problems are):
//this class is the player graphic

import javax.swing.*;
import java.awt.*;

    public class player extends JPanel 

    int x = 50;
    int y = 50;

    public void paint() //This is where the graphic is painted to the screen
        repaint();
    

    public void paintComponent(Graphics g) 
        //This is where the graphic is 'manufactured'
        super.paintComponent(g);
        g.setColor(Color.GREEN);
        int width = 20;
        int height = 20;
        g.fillRect(x, y, width, height);

        int width2 = 10;
        int height2 = 10;
        g.fillOval(x, y, width2, height2);
    

我试图很好地评论的类,所以你知道它的意思。 我从 youtube 频道 macheads101 获得了 keyconfigofplayer 的代码,我认为如何在 Java 第 12 集或第 11 集编程 GUI。我认为我的问题不在于更新图像,而在于检测何时按下然后释放该键。所以也许我应该做一个while循环说明: 如果按下此键,则 x 坐标 + 10 直到完成并不断更新位置。 我还想问一下,什么时候用public、private和void?我不明白那些:(如果我正确地完成了扩展播放器实现的事情。我试图仔细改变macheads101的代码,当我完全复制它时它也不起作用。所以我真的不知道出了什么问题。我会很感激的如果你回答了我的问题并帮助我修改了代码。最终它会成为一个射击游戏,就像街机游戏“太空入侵者”或“龙射击”。

【问题讨论】:

我知道使用 youtube 视频来学习东西很诱人,但它们确实不是编码的最佳解决方案。书面教程将允许您以更加可控的速度完成任务并查看实际代码。 哦,还有一件事。你可以在 Swing 中制作游戏,但你会发现你相当有限,因为它更多地是为商业类型软件设计的。要在 Java 中编写游戏,您需要一个图形库。例如本教程系列在 jME3 中制作了一个霓虹灯射手:gamedevelopment.tutsplus.com/tutorials/… 关于第一段我不得不说你是当年的家长。你的儿子有很大的编程潜力。继续鼓励他! "我正在学习 Java 的儿子(11 岁)将输入一个问题和一些代码。他告诉我他无法在网站上找到该问题的答案。您将阅读我对他的问题的编辑版本。非常感谢。“干得好,用棍子打败了 COPPA!像你这样的人让世界运转起来。 【参考方案1】:

了解java.awt.event.KeyListener

代码应如下所示:

    f.addKeyListener(new KeyListener() 
        @Override
        public void keyTyped(KeyEvent e) 
        

        @Override
        public void keyPressed(KeyEvent e) 
            System.out.println("Key pressed code=" + e.getKeyCode() + ", char=" + e.getKeyChar());
        

        @Override
        public void keyReleased(KeyEvent e) 
        
    );

【讨论】:

【参考方案2】:

所以 GUI 是事件驱动的。发生的一切都是由事件驱动的。按键是一个事件。组件需要监听事件,并在事件触发时做一些事情。你可以阅读更多关于如何编写不同的监听器here。一些基本的侦听器很容易识别(按名称),例如KeyListenerMouseListenerActionListener 对于按钮按下也很常见。您需要通过教程了解不同的听众。

请注意,尽管在 Swing 中使用 KeyListener 时会出现焦点问题,因此最好使用 键绑定。如KeyListener 教程中所述:

要定义对特定键的特殊反应,请使用键绑定而不是键侦听器

可以在here 找到键绑定教程,在here 可以看到一个示例。这是示例中的 gif,显示了使用键绑定的按键按下矩形的移动


更新请注意。

    不要覆盖JPanelpaint 方法

    永远不要paint/paintComponent 方法内部调用 repaint()

    public void paint() //This is where the graphic is painted to the screen
        repaint();
    
    

完全摆脱上面的代码。

【讨论】:

【参考方案3】:

有一个很棒的库,它运行流畅,它监听全局事件。这是唯一对我来说没有任何问题的东西: https://github.com/kwhat/jnativehook

它抓取系统中的每个事件,对于任何开发都非常酷。

你可以这样使用它:

package main;

import org.jnativehook.GlobalScreen;
import org.jnativehook.NativeHookException;
import org.jnativehook.keyboard.NativeKeyEvent;
import org.jnativehook.keyboard.NativeKeyListener;

class MyKeyboard implements NativeKeyListener 

    public static void main(String[] args) 
        try 
            GlobalScreen.registerNativeHook();
         catch (NativeHookException ex) 
            System.err.println("There was a problem registering the native hook.");
            System.err.println(ex.getMessage());

            System.exit(1);
        

        GlobalScreen.addNativeKeyListener(new MyKeyboard());

        // Now press any keys and look at the output
    

    @Override
    public void nativeKeyPressed(NativeKeyEvent e) 
    

    @Override
    public void nativeKeyTyped(NativeKeyEvent nke) 
    

    @Override
    public void nativeKeyReleased(NativeKeyEvent nke) 
    


【讨论】:

【参考方案4】:

我在您的代码中没有看到任何实际监听按键或修改 x 和 y 位置的内容。只有更改 x 和 y 然后重新绘制屏幕时,圆圈才会移动。

您已经在此处设置了面板等,但实际上并未添加任何内容来响应用户操作。您可能需要在某处添加KeyListener 以响应按键。这可能在您正在做的教程中,或者在之前或之后的教程中。

【讨论】:

【参考方案5】:

KeyListener

您应该将他的 KeyListener 事件放在您需要的类中,而不是在 Main 方法中!

addKeyListener(new KeyListener() 
    public void keyPressed(KeyEvent e) 
        //This is where you want to implement your key!
        if(e.getKeyCode() == KeyEvent.VK_SPACE)
             //Fire Gun!
        
        ....
    

    public void keyReleased(KeyEvent e)  //I dont really use these!
    

    public void keyTyped(KeyEvent e)  //I dont really use these!
    
);

更多关于密钥的信息:KeyListeners


公共和私人:

现在对于公共和私人来说,*** 上已经有一个答案,我认为它做得很好! Here


函数/方法和无效:

至于 Void,它用于您希望什么都不返回的函数中!我不知道你对函数的了解程度,我举个例子:

int sum;
public int addReturn(int x, int y)
    sum = x +y;
    return sum;

它的作用是将两个整数作为 x 和 y 相加,然后将总和作为整数返回!

使用 void 你可以做的是:

int sum;
public void add(int x, int y)
    sum = x+ y;

在这里你什么都不返回,但它仍然将 x+y 存储到 sum 中!

所以在你的课堂上:

int Summation, x = 10, y = 10;
summation = addReturn(x,y); //<-- This will place summation = 10+10 = 20

对于 void 函数,您不需要创建变量,因为它不返回值,而是在函数内设置值。你需要做的就是调用它

add(x,y);

如果您需要更多帮助,请发表评论! :) 我也觉得你儿子这么小就对 Java 如此感兴趣真是太棒了。伟大的育儿:D

【讨论】:

感谢有关公共私人和无效的信息! 我在哪里把上面的代码放到我的程序中,抱歉,我没有包含它开头的 keyconfigofplayer 类 公共类 keyconfifgofplayer 扩展播放器实现 Actionlistener, keyListener 你不需要在课堂上实现它! @user3343497 你应该做的是这个公共类 keyConfigPlayer extends player addKeyListener(new KeyListener() 【参考方案6】:

假设你需要检测密钥 f,使用这个:

//packageStatement
import javax.swing.*;
import java.awt.event.*;
//more imports
public class window 
 //code
 f.addKeyListener(new KeyListener() 
    @Override
    public void KeyTyped(KeyEvent e) 
        if(e.getKeyChar == 'f')
           //code
        
    
    //more code
 );
 //more code

记得使用字符串字面量,因为 getKeyChar() 方法返回一个字符。

【讨论】:

以上是关于如何在Java中检测按键的主要内容,如果未能解决你的问题,请参考以下文章

如何在 OSX 上拖放期间检测 META 按键

JAVA编写类似按键精灵的程序用于游戏 会被检测到么?懂底层工作原理的JAVA高手进

如何检测按键?

如何检测按键?

如何同时检测按键和鼠标悬停

如何在nodejs中产生按键检测?