java - keyListener 未检测到按键

标签 java swing jframe awt listener

我想在 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) {}

}

最佳答案

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

  • KeyListener 仅在监听组件具有焦点时才起作用。
  • 并且该组件必须可聚焦。

但是还有更多...

  • 您不应该在 JFrame 中绘制
  • 改为在 JPanel 或 JComponent 中绘制
  • 并扩展paintComponent方法
  • 并调用 super 方法
  • 并在此处搜索类似问题以了解更多相关内容
  • 并查看绘图教程..
  • 接下来您将需要使用键绑定(bind)而不是 KeyListener。同样,这个站点已经对此进行了充分讨论,但 KeyListener 是非常低级的监听器。使用更高级别的构造(例如按键绑定(bind))几乎总是更好。绑定(bind)是 Swing 组件监听击键的方式。在关注组件方面,它们也更加灵活。

关于java - keyListener 未检测到按键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20308317/

相关文章:

java - JFrame 不绘制内容,仅在 ActionListener 内可见时显示白色矩形

java - 当 JFrame 全屏时显示标题栏不起作用

java - 可以在Java中传递指向Lambda的引用变量

java - JdbcBatchItemWriter 是否不支持 List<Map> 输入项?

java - JTextPane 阻止在父 JScrollPane 中滚动

java - 如何让JPanel的长宽自动伸缩?

java - Spring 3 : How to call @Async annotated methods from the TaskExecutor

Java map/collect 用于流对列表列表求和

java - 如何通过单击 GUI 中的按钮来更改面板的内容?

java - 为什么我的 JComponent 没有显示在背景 JFrame 之上?