如何在 Java 中检测按键

2022-09-03 18:27:22

我的儿子(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。我认为我的问题不在于更新图像,而在于检测何时按下并释放了该键。因此,也许我应该做一个临时循环,说明:如果按下此键,则+10到x坐标,直到其完成并不断更新位置。我还想问,什么时候使用公共,私人和无效?我不明白这些:(如果Ive完成了扩展播放器正确实现的事情。我试图仔细地改变macheads101的代码,当我完全复制它时,它也不起作用。所以我真的不知道出了什么问题。如果您回答了我的问题并帮助我更改代码,我将不胜感激。最终,它将成为一款射击游戏,就像街机游戏“太空侵略者”或“龙射手”一样。


答案 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是事件驱动的。发生的一切都是由一个事件驱动的。按键是一个事件。组件需要侦听事件,并在触发事件时执行某些操作。您可以在此处阅读有关如何编写不同侦听器的更多信息。一些基本的侦听器相当容易识别(按名称),如 或 。 对于按钮按下也很常见。您将需要完成教程并学习不同的听众。KeyListenerMouseListenerActionListener

请注意,使用 Swing 时存在焦点问题,因此最好使用键绑定。如教程中所述:KeyListenerKeyListener

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

可以在此处找到键绑定的教程,也可以在此处查看示例。下面是示例中的 gif,显示了使用键绑定按键时矩形的移动

enter image description here


更新只是通知。

  1. 不要覆盖paintJPanel
  2. 从不从方法内部调用repaint()paint/paintComponent

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

完全摆脱上面的代码。