Java 如何让关键事件发挥作用

Java 如何让关键事件发挥作用,java,input,keylistener,Java,Input,Keylistener,我一直在乱搞一些java代码,试图更好地了解该语言的工作原理,我想到了这个。我已经能够让球和框架工作,但我不能让它移动,甚至不能再跑了。它说最后一个大括号后面需要一个分号,但当我添加它时,很多东西都会出错。如果有帮助的话,跑步的问题首先出现在我尝试使用关键侦听器时 package com.edu4java.samplegame; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints

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

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);
    }
}

}您需要注册KeyListener 在主类中,添加一个方法来创建并返回KeyListener(包装您对KeyListener拥有的内容)。然后在main中,注册侦听器,类似这样:

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

frame.addKeyListener(main);

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
}
}

完成后,您需要在主方法中将其注册为

frame.addKeyListener(new keyListen(g));
我仍然对JPanel为什么不允许KeyListener感到困惑,但需要注意的是,使用关键事件监听器可能不是最好的主意