我正在尝试实现一个简单的键侦听器,用左键箭头绘制椭圆移动的图形。在用system.out.println进行测试后,椭圆不移动,甚至不读取按键。任何帮助都将不胜感激。
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
public class Game extends JFrame implements KeyListener{
int x = 450;
int y = 600;
public Game() {
setTitle("Game");
setSize(1024, 768);
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
public void paint(Graphics g) {
g.setColor(Color.BLACK);
g.fillOval(x, y, 100, 100);
}
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_LEFT) {
x = x + 20;
System.out.println("works");
}
}
public void keyReleased(KeyEvent e) {}
public void keyTyped(KeyEvent e) {}
public static void main(String[] args) {
Game game = new Game();
}
}发布于 2016-03-18 21:36:27
在用system.out.println进行测试后,椭圆不移动,甚至不读取按键。如能提供任何帮助,将不胜感激。
据我所见,您没有添加侦听器,因此当您按下键时不会发生任何事情。
如果要添加到当前的游戏类中,可以这样做:
this.addKeyListener(this);如果要在当前游戏类之外添加侦听器,则:
gameInstance.addKeyListener(gameInstance);代码的其他问题:
paint(g)。而不是覆盖paintComponent(g)。我们几乎没有理由重写paint(g)。JFrame。您可以考虑创建一个JPanel (不管它是自定义的还是不定制的)并将它添加到您的JFrame中。pack()您的框架,并且它将能够确定它自己的preferredSize。发布于 2016-03-18 21:27:52
您误解了KeyListener的用途和用途。类实现该接口,但只有实际在生成事件的组件上注册的实现才会接收该事件。即使组件本身是适当类型的侦听器,也是如此。也许,因此,你想
game.addKeyListener(game);还请注意,您可能需要处理线程问题。要正确同步GUI初始化代码,通常需要在EDT上运行,因为您可以在SwingUtilities.invokeAndWait()或SwingUtilities.invokeLater()的帮助下完成。
发布于 2016-03-18 21:41:59
让我们从KeyListener问题开始。KeyListener因不响应关键输入而闻名,并且只在组件可聚焦且具有焦点时才会生成KeyEvent。
相反,您应该使用键绑定 API。
接下来,您应该避免重写顶级容器(如paint )的JFrame,有关详细信息,请参阅
作为一个普遍的经验规则,您应该完全避免扩展JFrame,而应该使用类似于JPanel的东西,并重写它的paintComponent方法。
还请记住,Swing中的绘画是由一系列链式方法调用组成的,除非您真的、真的、真的知道您在做什么,否则在执行任何点画之前,您应该一直调用超级画法。
有关详细信息,请参阅AWT和Swing中的绘画和表演定制绘画
https://stackoverflow.com/questions/36094434
复制相似问题