首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >KeyListener问题

KeyListener问题
EN

Stack Overflow用户
提问于 2016-03-18 21:20:41
回答 3查看 55关注 0票数 2

我正在尝试实现一个简单的键侦听器,用左键箭头绘制椭圆移动的图形。在用system.out.println进行测试后,椭圆不移动,甚至不读取按键。任何帮助都将不胜感激。

代码语言:javascript
复制
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();
  }
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-03-18 21:36:27

在用system.out.println进行测试后,椭圆不移动,甚至不读取按键。如能提供任何帮助,将不胜感激。

据我所见,您没有添加侦听器,因此当您按下键时不会发生任何事情。

如果要添加到当前的游戏类中,可以这样做:

代码语言:javascript
复制
this.addKeyListener(this);

如果要在当前游戏类之外添加侦听器,则:

代码语言:javascript
复制
gameInstance.addKeyListener(gameInstance);

代码的其他问题:

  • 您可能希望使用KeyBindings而不是KeyListener。
  • 不要覆盖paint(g)。而不是覆盖paintComponent(g)。我们几乎没有理由重写paint(g)
  • 通常我们不会创建自定义的JFrame。您可以考虑创建一个JPanel (不管它是自定义的还是不定制的)并将它添加到您的JFrame中。
  • 在将JPanel (容器)添加到您的JFrame之后,您可以pack()您的框架,并且它将能够确定它自己的preferredSize
票数 3
EN

Stack Overflow用户

发布于 2016-03-18 21:27:52

您误解了KeyListener的用途和用途。类实现该接口,但只有实际在生成事件的组件上注册的实现才会接收该事件。即使组件本身是适当类型的侦听器,也是如此。也许,因此,你想

代码语言:javascript
复制
game.addKeyListener(game);

还请注意,您可能需要处理线程问题。要正确同步GUI初始化代码,通常需要在EDT上运行,因为您可以在SwingUtilities.invokeAndWait()SwingUtilities.invokeLater()的帮助下完成。

票数 3
EN

Stack Overflow用户

发布于 2016-03-18 21:41:59

让我们从KeyListener问题开始。KeyListener因不响应关键输入而闻名,并且只在组件可聚焦且具有焦点时才会生成KeyEvent

相反,您应该使用键绑定 API。

接下来,您应该避免重写顶级容器(如paint )的JFrame,有关详细信息,请参阅

作为一个普遍的经验规则,您应该完全避免扩展JFrame,而应该使用类似于JPanel的东西,并重写它的paintComponent方法。

还请记住,Swing中的绘画是由一系列链式方法调用组成的,除非您真的、真的、真的知道您在做什么,否则在执行任何点画之前,您应该一直调用超级画法。

有关详细信息,请参阅AWT和Swing中的绘画表演定制绘画

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36094434

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档