Swing的KeyListener和多个按键同时按下

当同时按下两个键盘键时,是否有任何常规方式来跟踪事件?我有几个想法,例如,记住键和事件的生成时间,以便我们可以在连续的事件处理程序调用中检查这两个事件之间的时间差,并确定是否是两个按钮的事件。但这看起来像是对立。



呼如林
浏览 1087回答 3
3回答

哈士奇WWW

使用一个集合来记住当前按下了哪些键,并检查每次按下一个键是否都按下了多个键。class MultiKeyPressListener implements KeyListener {&nbsp; &nbsp; // Set of currently pressed keys&nbsp; &nbsp; private final Set<Character> pressed = new HashSet<Character>();&nbsp; &nbsp; @Override&nbsp; &nbsp; public synchronized void keyPressed(KeyEvent e) {&nbsp; &nbsp; &nbsp; &nbsp; pressed.add(e.getKeyChar());&nbsp; &nbsp; &nbsp; &nbsp; if (pressed.size() > 1) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // More than one key is currently pressed.&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // Iterate over pressed to get the keys.&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp; &nbsp; @Override&nbsp; &nbsp; public synchronized void keyReleased(KeyEvent e) {&nbsp; &nbsp; &nbsp; &nbsp; pressed.remove(e.getKeyChar());&nbsp; &nbsp; }&nbsp; &nbsp; @Override&nbsp; &nbsp; public void keyTyped(KeyEvent e) {/* Not used */ }}

料青山看我应如是

KeyListener接口允许分别检测按键的按下和释放。因此,您可以维护一组“活动键”,即已按下但尚未释放的键。

人到中年有点甜

如果7年后我尝试这样做(只是看是否可行),那么其他人也可能会...下面的代码控制8轴方向的运动,注释中有解释。但基本上,KeyListener只要定义可能的移动位置,然后a 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 {&nbsp; &nbsp; private static final long serialVersionUID = 7722803326073073681L;&nbsp; &nbsp; private boolean left = false;&nbsp; &nbsp; private boolean up = false;&nbsp; &nbsp; private boolean down = false;&nbsp; &nbsp; private boolean right = false;&nbsp; &nbsp; private JLabel lbl = new JLabel("#");&nbsp; &nbsp; public Move8Axis() {&nbsp; &nbsp; &nbsp; &nbsp; // Just setting up the window and objects&nbsp; &nbsp; &nbsp; &nbsp; setSize(400, 400);&nbsp; &nbsp; &nbsp; &nbsp; setDefaultCloseOperation(EXIT_ON_CLOSE);&nbsp; &nbsp; &nbsp; &nbsp; setVisible(true);&nbsp; &nbsp; &nbsp; &nbsp; lbl.setBounds(100, 100, 20, 20);&nbsp; &nbsp; &nbsp; &nbsp; add(lbl);&nbsp; &nbsp; &nbsp; &nbsp; setLocationRelativeTo(null);&nbsp; &nbsp; &nbsp; &nbsp; // Key listener, will not move the JLabel, just set where to&nbsp; &nbsp; &nbsp; &nbsp; addKeyListener(new KeyListener() {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; @Override&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public void keyTyped(KeyEvent e) {}&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; @Override&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public void keyReleased(KeyEvent e) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (e.getKeyCode() == KeyEvent.VK_LEFT) left = false;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (e.getKeyCode() == KeyEvent.VK_RIGHT) right = false;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (e.getKeyCode() == KeyEvent.VK_UP) up = false;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (e.getKeyCode() == KeyEvent.VK_DOWN) down = false;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; @Override&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public void keyPressed(KeyEvent e) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (e.getKeyCode() == KeyEvent.VK_LEFT) left = true;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (e.getKeyCode() == KeyEvent.VK_RIGHT) right = true;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (e.getKeyCode() == KeyEvent.VK_UP) up = true;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (e.getKeyCode() == KeyEvent.VK_DOWN) down = true;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; });&nbsp; &nbsp; &nbsp; &nbsp; // This thread will read the 4 variables left/right/up/down at every 30 milliseconds&nbsp; &nbsp; &nbsp; &nbsp; // It will check the combination of keys (left and up, right and down, just left, just up...)&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; // And move the label 3 pixels&nbsp; &nbsp; &nbsp; &nbsp; new Thread(new Runnable() {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; @Override&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public void run() {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; try {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; while (true) {&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (left && up) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; lbl.setBounds(lbl.getX() - 3, lbl.getY() - 3, 20, 20);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } else if (left && down) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; lbl.setBounds(lbl.getX() - 3, lbl.getY() + 3, 20, 20);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } else if (right && up) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; lbl.setBounds(lbl.getX() + 3, lbl.getY() - 3, 20, 20);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } else if (right && down) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; lbl.setBounds(lbl.getX() + 3, lbl.getY() + 3, 20, 20);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } else if (left) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; lbl.setBounds(lbl.getX() - 3, lbl.getY(), 20, 20);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } else if (up) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; lbl.setBounds(lbl.getX(), lbl.getY() - 3, 20, 20);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } else if (right) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; lbl.setBounds(lbl.getX() + 3, lbl.getY(), 20, 20);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } else if (down) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; lbl.setBounds(lbl.getX(), lbl.getY() + 3, 20, 20);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Thread.sleep(30);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } catch (Exception ex) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ex.printStackTrace();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.exit(0);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; }).start();&nbsp; &nbsp; }&nbsp; &nbsp; public static void main(String[] args) {&nbsp; &nbsp; &nbsp; &nbsp; new Move8Axis();&nbsp; &nbsp; }}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java