为什么没有检测到密钥?
Why aren't keys being detected?
我有一个 Pong 游戏,正在尝试弄清楚如何检测几个键。这是我的桨 class:
import java.awt.geom.*;
public class Paddle extends Rectangle2D.Float{
public Paddle(int x, int y){
super.x = x;
super.y = y;
super.width = w;
super.height = h;
}
}
这里是 PongBall
class:
import java.awt.geom.*;
public class PongBall extends Ellipse2D.Float{
public PongBall(int x, int y, int w, int h){
super.x = x;
super.y = y;
super.width = w;
super.height = h;
}
}
这是球拍和球所在的class/area:
import java.awt.*;
import java.awt.geom.*;
import javax.swing.JComponent;
public class PongPlayArea extends JComponent implements KeyListener{
public int width, height;
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setSize(600, 600);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
PongPlayArea ppa = new PongPlayArea(600, 600);
Timer t = new Timer(20, e -> {ppa.repaint();});
t.start();
frame.add(ppa);
frame.setVisible(true);
}
public PongPlayArea(int width, int height){
this.width = width;
this.height = height;
this.addKeyListener(this);
}
public void paintComponent(Graphics g){
Graphics2D g2 = (Graphics2D)g;
g2.setRenderingHint(
RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g2.setColor(Color.BLACK);
g2.draw(new Rectangle2D.Float(0, 0, width, height));
g2.fill(getVisibleRect());
g2.setColor(Color.WHITE);
g2.draw(new Paddle());
}
public Dimension getPreferredSize(){
return new Dimension(width, height);
}
public void keyPressed(KeyEvent e){
if(e.getKeyCode()==KeyEvent.VK_RIGHT){
System.out.println("Success");
}
}
public void keyReleased(KeyEvent e){
}
public void keyTyped(KeyEvent e){
}
}
我的问题是,无论何时按下按键(在本例中为右箭头键),都没有任何反应。我不知道出了什么问题。有人有解决办法吗?
编辑:
回答:
正如 camickr 所建议的,我决定使用键绑定,而不是使用 KeyListener,这样效率更高。
您需要调用 .addKeyListener()
来注册您的 KeyListener
实现。在要监听关键事件的组件上调用它。大概this.addKeyListener(this);
。我会让你的 KeyListener 实现成为一个单独的 class.
我认为更好的解决方案是使用 KeyboardFocusManager
。您可能会遇到 KeyListeners 的问题(如上所述),因为它需要集中注意力,您必须注册 Listener 并将方法添加到您的 PongPlayArea
class (变得很长)等。我有一个问题与您的相似,我找到的最佳解决方案是 KeyboardFocusManager
。
致您的构造函数:
KeyboardFocusManager manager = KeyboardFocusManager.getCurrentKeyboardFocusManager();
manager.addKeyEventDispatcher(new MyDispatcher());
并创建 class:
private class GameDispatcher implements KeyEventDispatcher {
@Override
public boolean dispatchKeyEvent(KeyEvent e) {
if (e.getID() == KeyEvent.KEY_PRESSED && e.getKeyCode() == 82) {
System.out.println("Success");
}
return false;
}
}
如果需要,请检查它是否有效,并告诉我它是否解决了您的问题。
正如 camickr 所说,键绑定是必经之路。不要使用按键侦听器。
我有一个 Pong 游戏,正在尝试弄清楚如何检测几个键。这是我的桨 class:
import java.awt.geom.*;
public class Paddle extends Rectangle2D.Float{
public Paddle(int x, int y){
super.x = x;
super.y = y;
super.width = w;
super.height = h;
}
}
这里是 PongBall
class:
import java.awt.geom.*;
public class PongBall extends Ellipse2D.Float{
public PongBall(int x, int y, int w, int h){
super.x = x;
super.y = y;
super.width = w;
super.height = h;
}
}
这是球拍和球所在的class/area:
import java.awt.*;
import java.awt.geom.*;
import javax.swing.JComponent;
public class PongPlayArea extends JComponent implements KeyListener{
public int width, height;
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setSize(600, 600);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
PongPlayArea ppa = new PongPlayArea(600, 600);
Timer t = new Timer(20, e -> {ppa.repaint();});
t.start();
frame.add(ppa);
frame.setVisible(true);
}
public PongPlayArea(int width, int height){
this.width = width;
this.height = height;
this.addKeyListener(this);
}
public void paintComponent(Graphics g){
Graphics2D g2 = (Graphics2D)g;
g2.setRenderingHint(
RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g2.setColor(Color.BLACK);
g2.draw(new Rectangle2D.Float(0, 0, width, height));
g2.fill(getVisibleRect());
g2.setColor(Color.WHITE);
g2.draw(new Paddle());
}
public Dimension getPreferredSize(){
return new Dimension(width, height);
}
public void keyPressed(KeyEvent e){
if(e.getKeyCode()==KeyEvent.VK_RIGHT){
System.out.println("Success");
}
}
public void keyReleased(KeyEvent e){
}
public void keyTyped(KeyEvent e){
}
}
我的问题是,无论何时按下按键(在本例中为右箭头键),都没有任何反应。我不知道出了什么问题。有人有解决办法吗?
编辑: 回答: 正如 camickr 所建议的,我决定使用键绑定,而不是使用 KeyListener,这样效率更高。
您需要调用 .addKeyListener()
来注册您的 KeyListener
实现。在要监听关键事件的组件上调用它。大概this.addKeyListener(this);
。我会让你的 KeyListener 实现成为一个单独的 class.
我认为更好的解决方案是使用 KeyboardFocusManager
。您可能会遇到 KeyListeners 的问题(如上所述),因为它需要集中注意力,您必须注册 Listener 并将方法添加到您的 PongPlayArea
class (变得很长)等。我有一个问题与您的相似,我找到的最佳解决方案是 KeyboardFocusManager
。
致您的构造函数:
KeyboardFocusManager manager = KeyboardFocusManager.getCurrentKeyboardFocusManager();
manager.addKeyEventDispatcher(new MyDispatcher());
并创建 class:
private class GameDispatcher implements KeyEventDispatcher {
@Override
public boolean dispatchKeyEvent(KeyEvent e) {
if (e.getID() == KeyEvent.KEY_PRESSED && e.getKeyCode() == 82) {
System.out.println("Success");
}
return false;
}
}
如果需要,请检查它是否有效,并告诉我它是否解决了您的问题。
正如 camickr 所说,键绑定是必经之路。不要使用按键侦听器。