【问题标题】:keyListener not detecting keypresseskeyListener 未检测到按键
【发布时间】:2013-12-16 23:33:45
【问题描述】:

我想围绕JFrame 框移动一个圆形图形,并决定添加一个KeyListener,但我似乎无法让它工作。

package keyBoardInput;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Window;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.Rectangle;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class window extends JFrame implements KeyListener {

    Rectangle rect;

    //KeyListener keyListener;

    public void init() {

        this.addKeyListener(this);

        setFocusTraversalKeysEnabled(true);
        requestFocus(true);

        rect = new Rectangle(0,0,100,100);
    }

    public window() {

        super("Title bar");
        setSize(800,600);
        setVisible(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);

        setFocusTraversalKeysEnabled(true);
        requestFocus(true);
        setFocusable(true);
        //addKeyListener(keyListener);
    }

    public void paint(Graphics g){

        Graphics2D g2 = (Graphics2D)g;

        g2.setColor(Color.cyan);
        g2.fillRect(0,0,800,600);
        g2.setColor(Color.orange);
        g2.fillOval(0,0,100,100);
    }

    public void keyPressed(KeyEvent e) {

        System.out.println("test");
        int key = e.getKeyCode();

        if (key == KeyEvent.VK_W) {
            rect.setLocation(rect.x + 0, rect.y + 10);
        }
        if (key == KeyEvent.VK_S) {
            rect.setLocation(rect.x - 0, rect.y - 10);
        }
        if (key == KeyEvent.VK_A) {
            rect.setLocation(rect.x - 10, rect.y + 0);
        }
        if (key == KeyEvent.VK_D) {
        rect.setLocation(rect.x + 10, rect.y + 0);
        }

        repaint();
    }

    public void keyTyped(KeyEvent e) {}
    public void keyReleased(KeyEvent e) {}

}

【问题讨论】:

  • Ive watched plenty of tutorials, and read plenty of articles, - 真的吗?几乎您在论坛中找到的每个答案都会告诉您不要使用 KeyListener 和 USE Key Bindings。只需在此页面右侧的 "Related" 标题下查看有关此主题的一些示例帖子。

标签: java swing jframe awt listener


【解决方案1】:

如果您在这里搜索类似的问题,答案几乎总是:

  • KeyListeners 仅在被监听的组件具有焦点时才起作用。
  • 并且组件必须是可聚焦的。

但还有更多...

  • 不应在 JFrame 中绘制
  • 改为在 JPanel 或 JComponent 中绘制
  • 并扩展paintComponent方法
  • 并调用超级方法
  • 并在此处搜索类似问题以了解更多信息
  • 并查看绘图教程..
  • 接下来,您需要使用键绑定而不是 KeyListener。同样,这在本网站上已得到很好的讨论,但 KeyListeners 是非常低级的侦听器。您几乎总是最好使用更高级别的构造,例如键绑定。绑定是 Swing 组件监听击键的方式。在关注组件方面,它们也更加灵活。

【讨论】:

  • 和命名约定很重要,应该使用,大写类名,如Window(不是window
  • KeyBindings 必须有一个更好的理由,因为它们比 KeyListeners 的级别“更高”
  • 感谢您的回复。我已经真正搜索过该网站,这就是我获得整个 setFocusable 和 setFocusTraversalKeysEnabled(true); ,还是什么都没有。正如我所说,我不是整个 jframe 的事情,只是尝试一些新的东西。是否有任何代码行可以添加或删除以使该特定程序正常工作。我试图按照我看过的一些教程继续前进,而不是进入 keyBindings。谢谢。
  • @MistressDavid 如何更好地控制焦点级别,并以Actions API 的形式提供可重用的 API,可用于按钮和菜单。 ..
  • @DrewWood, Im trying to stay on route with some of the tutorials ive watched, not get into keyBindings - 了解如何使用更好的方法,不要将代码基于为 AWT 而不是 Swing 设计的旧教程。 Swing 具有更强大的功能。我们厌倦了一遍又一遍地回答同一个问题,因为人们没有学习新技术。
猜你喜欢
  • 2019-09-07
  • 2015-07-09
  • 1970-01-01
  • 2015-05-07
  • 1970-01-01
  • 2012-08-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多