我已经用Java创建了自己的俄罗斯方块版本,我添加了使用JButton和某些键盘键移动形状的可能性。我使用的代码片段如下:
leftButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent E) {
moveLeft();
}
});
rightButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent E) {
moveRight();
}
});
rotateButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent E) {
rotateMovingShape();
}
});
myPanel.addKeyListener(new KeyAdapter(){
public void keyPressed(KeyEvent event) {
int keyCode = event.getKeyCode();
if (keyCode == event.VK_A)
{
moveLeft();
}
if (keyCode == event.VK_D)
{
moveRight();
}
if (keyCode == event.VK_S)
{
rotateMovingShape();
}
}
});
我遇到的问题是,在使用JButtons之后,我无法再用键盘键控制形状。我怀疑它与获得/失去焦点有关,但我不确定。谁能告诉我发生了什么事?
答案 0 :(得分:2)
您遇到了这个问题,因为您使用的是KeyListener
,而不是您需要使用Key Bindings。例如:
component.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_A,0), "aPressed");
component.getActionMap().put("aPressed", new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("a key");
}
});
component.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_D,0), "dPressed");
component.getActionMap().put("dPressed", new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("d key");
}
});
// other bindings
其中component
是您的JPanel
。
答案 1 :(得分:0)
KeyListener仅在组件具有键盘焦点时才接收键事件。单击按钮可将焦点转移到它们并远离面板,因此您无法获得事件。以下任何一种方法都可以解决这个问题:
在按钮上调用setFocusable(false);
,以便他们不会窃取焦点。
也将KeyListener添加到按钮中。
使用key bindings代替KeyListener,这样您就可以按下按键,无论组件是否具有焦点。