我想在 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/