如何在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。一些基本的侦听器很容易识别(按名称),例如KeyListener
或MouseListener
。 ActionListener
对于按钮按下也很常见。您需要通过教程了解不同的听众。
请注意,尽管在 Swing 中使用 KeyListener
时会出现焦点问题,因此最好使用 键绑定。如KeyListener
教程中所述:
要定义对特定键的特殊反应,请使用键绑定而不是键侦听器
可以在here 找到键绑定教程,在here 可以看到一个示例。这是示例中的 gif,显示了使用键绑定的按键按下矩形的移动
更新请注意。
-
不要覆盖
JPanel
的paint
方法
永远不要从 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中检测按键的主要内容,如果未能解决你的问题,请参考以下文章