Java 按键赢了';行不通

Java 按键赢了';行不通,java,swing,awt,keylistener,keyevent,Java,Swing,Awt,Keylistener,Keyevent,由于某种原因,我的程序在我按下某个键时没有检测到,即使它应该是正常的 这是我的代码: import javax.swing.*; public class Frame { public static void main(String args[]) { Second s = new Second(); JFrame f = new JFrame(); f.add(s); f.setVisible(true); f.setDefaultClose

由于某种原因,我的程序在我按下某个键时没有检测到,即使它应该是正常的

这是我的代码:

import javax.swing.*;

public class Frame {
    public static void main(String args[]) {

    Second s = new Second();
    JFrame f = new JFrame();
    f.add(s);
    f.setVisible(true);
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.setTitle("Bouncing Ball");
    f.setSize(600, 400);
}

}  
这是第二节课:

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Rectangle2D;

 import javax.swing.*;

public class Second extends JPanel implements ActionListener, KeyListener {
Timer t = new Timer(5, this);
double x = 0, y = 0, velX =0 , velY = 0;

public void paintComponent(Graphics g) {
    super.paintComponent(g);
    Graphics2D g2 = (Graphics2D) g;
    Rectangle2D circle = new Rectangle2D.Double(x, y, 40, 40);
    g2.fill(circle);
    t.start();
}

public void actionPerformed(ActionEvent e) {

    x += velX;
    y += velY;

    repaint();
}

public void up() {
    velY = -1.5;
    velX = 0;
}

public void down() {
    velY = 1.5;
    velX = 0;
}

public void keyPressed(KeyEvent e) {
    int KeyCode = e.getKeyCode();

    if (KeyCode == KeyEvent.VK_Z) {
        up();
    }

    if (KeyCode == KeyEvent.VK_S) {
        down();
    }
}

public void keyTyped(KeyEvent e){

}

public void keyReleased(KeyEvent e){

}

}

如何解决此问题?

出于测试目的,请向JFrame添加一个侦听器,然后查看是否有响应。如果您这样做,那么这意味着JFrame没有将事件传递给第二个,可能是因为第二个没有焦点

您也可以尝试调用
requestFocusInWindow()

当用户单击组件时,或者当用户在组件之间单击选项卡时,或者当用户与组件交互时,组件通常会获得焦点。还可以通过编程方式为组件指定焦点,例如当其包含的框架或对话框可见时。此代码段显示了如何在每次窗口获得焦点时为特定组件提供焦点:

我还建议使用比
s
f
更具描述性的变量,以及比
Second
更具描述性的类名

  • 计时器似乎不起作用的原因是,
    velX
    velY
    等于0,因此它不会增加任何值。如果您给它们一个值,它将设置动画

  • 钥匙不能用的原因是

  • 因为您尚未将
    KeyListener
    注册到面板
  • 您需要
    setfocusable(true)
  • 您需要在
    up()
    down()
    方法或
    keyPressed()
    方法中调用
    repaint()
  • 您需要在
    up()
    down()方法中增加/减少
    y

添加下面的构造函数,将
repaint()
添加到
keyPressed()
并正确递增/递减,它就可以工作了

public Second(){
    setFocusable(true);
    addKeyListener(this);
}
添加上面的构造函数。然后在按下键的情况下重新绘制

public void keyPressed(KeyEvent e) {
    int KeyCode = e.getKeyCode();

    if (KeyCode == KeyEvent.VK_Z) {
        up();
        repaint();
    }

    if (KeyCode == KeyEvent.VK_S) {
        down();
        repaint();
    }
}
增量/减量

public void up() {
    y -= 10;
}

public void down() {
    y += 10;
}

尽管这可能有效,但建议使用键绑定


请参见|

您是否尝试过在
按键
函数中调试和设置断点?对于Swing,通常在基于AWT的较低级别
按键侦听器上使用按键绑定。有关如何使用它们的详细信息,请参阅。
public void up() {
    y -= 10;
}

public void down() {
    y += 10;
}