keyListener未检测到按键
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了keyListener未检测到按键相关的知识,希望对你有一定的参考价值。
我想围绕一个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) {}
}
答案
如果你在这里搜索类似的问题,答案几乎总是:
- KeyListeners仅在被侦听组件具有焦点时才起作用。
- 组件必须是可聚焦的。
但还有更多......
- 你不应该在JFrame中绘制
- 而是在JPanel或JComponent中绘制
- 并扩展paintComponent方法
- 并调用超级方法
- 并在此搜索类似的问题以获得更多相关信息
- 并检查绘图教程..
- 接下来,您将要使用键绑定而不是KeyListeners。同样,这个网站已经对此进行了很好的讨论,但KeyListeners是非常低级的监听器。你几乎总是更好地使用更高级别的结构,如键绑定。绑定是Swing组件侦听击键的方式。在组件焦点方面,它们也更加灵活。
以上是关于keyListener未检测到按键的主要内容,如果未能解决你的问题,请参考以下文章