【问题标题】:KeyPressed event not happening?KeyPressed 事件没有发生?
【发布时间】:2012-12-08 21:50:35
【问题描述】:

此代码构建正确,一切似乎都可以正常工作,但关键是什么都不做。我认为要么是动作侦听器,要么是椭圆没有更新。我正在尝试通过初学者Java游戏编程来工作。我相信这很容易,但我没有抓住它。如果这有所作为,我正在使用 sublime text 2 的 mac。

package javagame;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class JavaGame extends JFrame {

int x, y;

public class AL extends KeyAdapter {

    public void keyPressed(KeyEvent e) {
        int keycode = e.getKeyCode();
        if(keycode == e.VK_LEFT); {
            x-= 3;
        }
        if(keycode == e.VK_RIGHT); {
            x+= 3;
        }
        if(keycode == e.VK_UP); {
            y-= 3;
        }
        if(keycode == e.VK_DOWN); {
            y+= 3;
        }
    }


    public void keyReleased(KeyEvent e) {

    }
}

public JavaGame() {
    addKeyListener(new AL());
    setTitle("Jave Game");
    setSize(700, 700);
    setResizable(false);
    setVisible(true);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    x = 350;
    y = 350;
}

public void paint(Graphics g) {
    g.fillOval(x, y, 15, 15);

    repaint();
}

public static void main(String[] args) {
    new JavaGame();
}

}

【问题讨论】:

  • 如有疑问,让问题更简单。首先验证您是否通过System.out.println 语句进入keyPressed,然后确认是否按下了右键,最后确认您是否正在更新paint blob。

标签: java swing keylistener keyevent


【解决方案1】:

您需要从 if 语句中删除分号:

if (keycode == e.VK_LEFT)
{
   x-= 3;
}

目前,if 语句后面的代码块是独立呈现的,因为分号终止这些语句。


一些Swing 特定的注释:

  • 最好使用子类JComponent 中的paintComponent 以获得更好的绘画效果 性能。
  • 使用Key bindings 而不是KeyListener 来改进关键事件管理。这是example

【讨论】:

  • 您应该向他展示如何使用键绑定的简单示例。
  • 哇,我什至不知道我为什么把它们放在那里。谢谢,我认为这很明显。我感谢快速回答和有用的链接我对编码真的很陌生,但至少我变得更好了。
  • @SavgStorm 每个人都在通过练习变得更好。不仅是“新”的。学习编码的最好方法(在我看来)是实际编码。因此,我想你是在正确的轨道上。 ;)
【解决方案2】:

即使有建议的更正,您仍然可能会遇到问题。

首先,JFrame 实际上在其顶部包含许多组件,即根窗格,其中包含内容和分层窗格以及玻璃窗格(通常不可见)。如果这些组件中的任何一个因任何原因获得键盘焦点,则您的 key listener 很可能会被忽略。

更好的解决方案是使用key bindings API,它可以更好地控制焦点问题。

您还违反了油漆合同。在大多数情况下,您需要调用super.paint,实际上,不鼓励您重写顶级容器的绘制方法,相反,您可以从JPanel 之类的东西扩展并重写它的paintComponent 方法。

这些绘制方法执行非常重要的工作,您不应轻易忽略/跳过它们。查看Painting in AWT and SwingCustom Painting in Swing 了解更多信息

【讨论】:

  • 我认为他现在这样做是为了简单。但是是的,我认为这其中的很多内容是不恰当的,它只是为了教授让某些东西在屏幕上移动的基本概念。下一个教程切换到使用图像和线程。不过感谢您提供的信息。
猜你喜欢
  • 1970-01-01
  • 2011-09-16
  • 2012-10-14
  • 1970-01-01
  • 1970-01-01
  • 2021-12-02
  • 2015-04-11
  • 2011-12-29
  • 1970-01-01
相关资源
最近更新 更多