当同时按下两个键盘键时,是否存在跟踪事件的常规方法? 我有几个想法,例如记住密钥和事件生成时间,以便我们可以在连续的事件处理程序调用中检查这两个事件之间的时间差并决定它是否是一个双按钮事件。但它看起来像一个kludge。
答案 0 :(得分:16)
使用集合记住当前按下了哪些键,并检查每次按下键时是否按下了多个键。
class MultiKeyPressListener implements KeyListener {
// Set of currently pressed keys
private final Set<Character> pressed = new HashSet<Character>();
@Override
public synchronized void keyPressed(KeyEvent e) {
pressed.add(e.getKeyChar());
if (pressed.size() > 1) {
// More than one key is currently pressed.
// Iterate over pressed to get the keys.
}
}
@Override
public synchronized void keyReleased(KeyEvent e) {
pressed.remove(e.getKeyChar());
}
@Override
public void keyTyped(KeyEvent e) {/* Not used */ }
}
答案 1 :(得分:2)
KeyListener接口允许分别检测按键和释放按键。因此,您可以维护一组“活动键”,即已按下但尚未释放的键。
答案 2 :(得分:0)
如果7年后我尝试这样做(只是看是否可行),那么其他人也可能...
以下代码控制8轴方向的运动,注释中有解释。但基本上,KeyListener
仅定义了可以移动的位置,然后Thread
将组合可能的目的地并移动JLabel
。
package tests;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;
import javax.swing.JLabel;
public class Move8Axis extends JFrame {
private static final long serialVersionUID = 7722803326073073681L;
private boolean left = false;
private boolean up = false;
private boolean down = false;
private boolean right = false;
private JLabel lbl = new JLabel("#");
public Move8Axis() {
// Just setting up the window and objects
setSize(400, 400);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
lbl.setBounds(100, 100, 20, 20);
add(lbl);
setLocationRelativeTo(null);
// Key listener, will not move the JLabel, just set where to
addKeyListener(new KeyListener() {
@Override
public void keyTyped(KeyEvent e) {}
@Override
public void keyReleased(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_LEFT) left = false;
if (e.getKeyCode() == KeyEvent.VK_RIGHT) right = false;
if (e.getKeyCode() == KeyEvent.VK_UP) up = false;
if (e.getKeyCode() == KeyEvent.VK_DOWN) down = false;
}
@Override
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_LEFT) left = true;
if (e.getKeyCode() == KeyEvent.VK_RIGHT) right = true;
if (e.getKeyCode() == KeyEvent.VK_UP) up = true;
if (e.getKeyCode() == KeyEvent.VK_DOWN) down = true;
}
});
// This thread will read the 4 variables left/right/up/down at every 30 milliseconds
// It will check the combination of keys (left and up, right and down, just left, just up...)
// And move the label 3 pixels
new Thread(new Runnable() {
@Override
public void run() {
try {
while (true) {
if (left && up) {
lbl.setBounds(lbl.getX() - 3, lbl.getY() - 3, 20, 20);
} else if (left && down) {
lbl.setBounds(lbl.getX() - 3, lbl.getY() + 3, 20, 20);
} else if (right && up) {
lbl.setBounds(lbl.getX() + 3, lbl.getY() - 3, 20, 20);
} else if (right && down) {
lbl.setBounds(lbl.getX() + 3, lbl.getY() + 3, 20, 20);
} else if (left) {
lbl.setBounds(lbl.getX() - 3, lbl.getY(), 20, 20);
} else if (up) {
lbl.setBounds(lbl.getX(), lbl.getY() - 3, 20, 20);
} else if (right) {
lbl.setBounds(lbl.getX() + 3, lbl.getY(), 20, 20);
} else if (down) {
lbl.setBounds(lbl.getX(), lbl.getY() + 3, 20, 20);
}
Thread.sleep(30);
}
} catch (Exception ex) {
ex.printStackTrace();
System.exit(0);
}
}
}).start();
}
public static void main(String[] args) {
new Move8Axis();
}
}