【问题标题】:How to detect a key press in Java如何在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!像你这样的人让世界运转起来。

标签: java eclipse swing keypress keylistener


【解决方案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,显示了使用键绑定的按键按下矩形的移动


    更新请注意。

    1. 不要覆盖JPanelpaint 方法
    2. 永远不要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


          公共和私人:

          现在对于公共和私人来说,StackOVerflow 上已经有一个答案,我认为它做得很好! 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() 方法返回一个字符。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-07-27
            • 2013-12-14
            相关资源
            最近更新 更多