KeyPress不起作用

时间:2013-12-31 17:05:21

标签: 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.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){

}

}

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

  • 计时器似乎不起作用的原因是,velXvelY等于0,因此,它不会增加任何内容。如果你给它们一个值,它就会生成动画。

  • 密钥无效的原因是

    1. 因为您尚未向面板注册KeyListener
    2. 您需要setfocusable(true)
    3. 您需要在repaint()方法中的up() down()方法中调用keyPressed()
    4. 您需要在yup()方法中增加/减少down()值。

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

public Second(){
    setFocusable(true);
    addKeyListener(this);
}

添加上面的构造函数。并在keyPressed中重新绘制

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

虽然这可行,但建议使用键绑定。

参见 How to use Key Bindings | The complete Creating a GUI with Swing trail

答案 1 :(得分:0)

出于测试目的,向JFrame添加一个监听器,看看你是否得到任何响应。如果这样做,那么这意味着JFrame没有将事件传递给Second,可能是因为Second没有焦点。

您也可以尝试拨打requestFocusInWindow()http://docs.oracle.com/javase/tutorial/uiswing/misc/focus.html

  

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

//Make textField get the focus whenever frame is activated.
> f.addWindowFocusListener(new WindowAdapter() {
>     public void windowGainedFocus(WindowEvent e) {
>         s.requestFocusInWindow();
>     } });

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