【问题标题】:How to get Key Events to work如何让关键事件发挥作用
【发布时间】:2023-03-16 20:54:02
【问题描述】:

我一直在搞乱一些 java 代码,试图更好地了解该语言的工作原理,我想出了这个。我已经能够让球和框架工作,但我不能让它移动,甚至不能再跑了。它说最后一个大括号后面需要一个分号,但是当我添加它时,很多事情都变成了错误。当我尝试使用 Key Listener 时,首先出现了运行问题,如果有帮助的话。

package com.edu4java.samplegame;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
@SuppressWarnings("serial")
public class Main extends JPanel {

private static final int ScreenW = 1000;
private static final int ScreenH = 800;
private static final int S_Radius = 25;
private static final int S_X = 100;
private static final int S_Y = 100;
private static final int Step = 100;

private static int x = S_X;             // x at center of the ball
private static int y = S_Y;             // y at center of the ball
private static int radius = S_Radius;   // radius of the ball

private void moveBall() {
   /* x = x + 1;
    y = y + 1;*/
}

KeyListener keyListener = new KeyListener() {
    int keyCode = e.getKeyCode();{
    switch( keyCode ) { 
        case KeyEvent.VK_UP:
            x = x - Step;
            break;
        case KeyEvent.VK_DOWN:
             x = x + Step;
            break;
        case KeyEvent.VK_LEFT:
            y = y - Step;
            break;
        case KeyEvent.VK_RIGHT :
            y = y + Step;
            break;
     }
  };

@Override 
public void paint(Graphics g) {
    super.paint(g);
    Graphics2D g2d = (Graphics2D) g;
    g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
        RenderingHints.VALUE_ANTIALIAS_ON);
    g2d.fillOval(x, y, 30, 30);
}

public static void main(String[] args) throws InterruptedException{
    JFrame frame = new JFrame("Forgotten");
    Main game = new Main();
    frame.add(game);
    frame.setSize(ScreenW, ScreenH);
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    while (true) {
        game.moveBall();
        game.repaint();
        Thread.sleep(10);
    }
}

}

【问题讨论】:

    标签: java input keylistener


    【解决方案1】:

    你需要注册 KeyListener 在您的 Main 类中,添加一个方法来创建和返回 KeyListener(包装 KeyListener 的内容)。然后在 main 中注册监听器,如下所示:

    frame.addKeyListener(main.getKeyListener());
    

    或者,您可以将 Main 本身设置为 KeyListener(Main 实现 KeyListener),实现方法,然后您只需使用 main:

    frame.addKeyListener(main);
    

    【讨论】:

      【解决方案2】:

      JPanel 无法使用“KeyListener”,建议你为这样的监听器创建一个新类

      public class keyListen implements KeyListener {
      
      private Main g;
      
      public keyListen(Main g) {
          this.g = g;
      }
      
      @Override
      public void keyTyped(KeyEvent e) {
          //code
      
      }
      
      @Override
      public void keyPressed(KeyEvent e) {
          // code
      
      }
      
      @Override
      public void keyReleased(KeyEvent e) {
          // code
      }
      

      }

      一旦你完成了,你需要在你的 main 方法中注册它

      frame.addKeyListener(new keyListen(g));
      

      我仍然对 JPanel 为什么不允许 KeyListener 感到困惑,但还有一点需要注意的是,使用 Key 事件侦听器可能不是最好的主意!

      【讨论】:

        猜你喜欢
        • 2021-10-01
        • 1970-01-01
        • 2021-02-26
        • 2013-09-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-20
        相关资源
        最近更新 更多