我有一个实现KeyListener
的类,一切正常,但是我的KeyListener
只有在点击Canvas后才有效,所以如果我开始游戏,我必须单击它然后我可以使用我的键盘,代码:
public class Game extends Canvas implements Runnable {
....
initGame() {
...
addKeyListener(new Keyboard());
setFocusable(true);
}
private class Keyboard implements KeyListener {
...
}
}
- 是否有一种方法可以在创建后使画布“活动”?
答案 0 :(得分:1)
KeyListener
只会在注册的组件具有焦点并且具有焦点时才会响应关键事件。
虽然您可以使用requestFocusInWindow
,但无法保证将焦点转移到组件,如果焦点由于某种原因(您单击其他组件)而丢失,则返回原点。
更好的解决方案是使用基于JComoponet
的组件(如JPanel
)并使用Key Bindings API,它允许您定义触发关键事件的焦点级别< / p>
答案 1 :(得分:0)
如果在Canvas
可见后添加JFrame
,则可能会出现问题。
致电
frame.setVisible(true)
最后在添加了所有组件后。
如果我在Canvas
显示后添加JFrame
,我就会发生这种情况,我必须点击Canvas
才能获得关注。
- 编辑 -
了解它的示例代码(在取消评论最后frame.setVisible(true)
后尝试)
import java.awt.Canvas;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;
public class CanvasDemo extends Canvas implements ActionListener, KeyListener {
public CanvasDemo() {
addKeyListener(this);
setFocusable(true);
}
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setVisible(true);
CanvasDemo apple = new CanvasDemo();
frame.add(apple);
frame.setTitle("The Game");
// frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
@Override
// animates rectangle
public void actionPerformed(ActionEvent arg0) {
System.out.println("action performed");
}
@Override
public void keyPressed(KeyEvent arg0) {
System.out.println("key pressed");
}
@Override
public void keyReleased(KeyEvent arg0) {
System.out.println("key released");
}
@Override
public void keyTyped(KeyEvent arg0) {
System.out.println("key typed");
}
}
答案 2 :(得分:0)
我在下一个方面解决了这个问题:我创建了Canvas对象,为它添加了KeyListener并使这个对象可以聚焦。在这些操作之后,我将Canvas对象添加到JFrame,一切都开始正常工作。