为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

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

3 回答

?
哈士奇WWW

TA贡献1799条经验 获得超6个赞

使用一个集合来记住当前按下了哪些键,并检查每次按下一个键是否都按下了多个键。


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 */ }

}


查看完整回答
反对 回复 2019-11-20
?
料青山看我应如是

TA贡献1772条经验 获得超8个赞

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


查看完整回答
反对 回复 2019-11-20
?
人到中年有点甜

TA贡献1895条经验 获得超7个赞

如果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 {


    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();

    }

}


查看完整回答
反对 回复 2019-11-20
  • 3 回答
  • 0 关注
  • 1086 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信