如何在Java中检测按键

时间:2014-02-23 15:07:16

标签: java eclipse swing keypress keylistener

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

如何在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直到完成并不断更新位置。 我还想问一下,何时使用公共,私有和无效?我不理解那些:(如果我已经完成了扩展播放器正确实现的东西。我试着仔细改变macheads101的代码,当我复制它时它确实不起作用。所以我真的不知道什么是错的。我会感谢你如果你回答了我的问题并帮助我修改了我的代码。最后它将成为一名射手,比如街机游戏“太空入侵者”或“龙射手”。

6 个答案:

答案 0 :(得分:12)

了解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) {
        }
    });

答案 1 :(得分:5)

因此GUI是事件驱动的。发生的一切都是由事件驱动的。按键是一个事件。组件需要侦听事件,并在事件触发时执行某些操作。您可以阅读有关如何编写不同侦听器here的更多信息。一些基本的听众很容易识别(通过名字),如KeyListenerMouseListener。按钮按下ActionListener也很常见。您需要阅读教程并了解不同的听众。

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

  

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

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

enter image description here


更新注意。

  1. 请勿覆盖paint
  2. JPanel方法
  3. 从不repaint()方法中调用paint/paintComponent

    public void paint() {//This is where the graphic is painted to the screen
        repaint();
    }
    
  4. 完全摆脱上面的代码。

答案 2 :(得分:2)

有一个很棒的图书馆可以顺利运作,它可以收听全球活动。这是我唯一没有任何问题的工作: 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) {
    }

}

答案 3 :(得分:1)

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

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

答案 4 :(得分:0)

<强>的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


公共和私人:

现在对于公共和私人,已经有了StackOVerflow的答案,我认为这项工作做得很好! Here


功能/方法和虚空:

对于Void,它用于你想要什么都不返回的功能!我不知道你对功能有多了解,但让我举个例子:

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

它的作用是添加两个以x和y给出的整数,然后将整数作为整数返回!

无效你可以做的是:

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

在这里你什么也没有返回,但它仍然将x + y存储到总和中!

所以在你的班上:

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

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

add(x,y);

如果您需要更多帮助,请发表评论! :) 我觉得你的儿子在这么年轻的时候对Java如此感兴趣也很棒。好父母:D

答案 5 :(得分:-1)

假设您需要检测键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()方法返回一个char。