有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

swing Java KeyListener keyPressed方法激发得太快

如果您使用java KeyListener类,您知道如果按住一个键keyPressed将触发一个KeyEvent,然后大约半秒后将以非常快的速度多次触发同一个键。我想知道是否有办法防止KeyEvents发射过快。我希望它们以一个很好的恒定速率,大约每500毫秒一次


共 (4) 个答案

  1. # 1 楼答案

    这是由你的操作系统控制的。但是你可以很容易地让你的处理程序检查它距离上次发射有多长时间,并做出相应的响应

  2. # 2 楼答案

    不,这完全取决于系统。你必须监听keyPressed事件,自己启动一个以固定速率触发事件的计时器,并在下一个keyReleased事件时停止它

    试试这样:

    component.addKeyListener(new KeyListener() {
    
        Timer t = new Timer();
        TimerTask tt;
    
        @Override
        public void keyTyped(KeyEvent e) {
        }
    
        @Override
        public void keyReleased(KeyEvent e) {
            tt.cancel();
            tt = null;
        }
    
        @Override
        public void keyPressed(KeyEvent e) {
            if (tt != null)
                return;
    
            tt = new TimerTask() {
                @Override
                public void run() {
                    System.out.println(System.currentTimeMillis() % 1000);
                }
            };
    
            t.scheduleAtFixedRate(tt, 0, 500);
        }
    });
    
  3. # 3 楼答案

    你可以,但诀窍不是减缓事件的触发,而是减缓处理它们的速度:

    KeyListener kl = new KeyListener() {
        private long lastPressProcessed = 0;
    
        @Override
        public void keyPressed(KeyEvent e) {
            if(System.currentTimeMillis() - lastPressProcessed > 500) {
                //Do your work here...
                lastPressProcessed = System.currentTimeMillis();
            }           
        }
    
        @Override
        public void keyTyped(KeyEvent e) {}
    
        @Override
        public void keyReleased(KeyEvent e) {   }
    
    };
    
  4. # 4 楼答案

    通常按键的自动重复率由系统设置;我不知道它是否可以从Java内部更改。但是,您可以使用事件到达时间,直到最后一次做出反应(或者在按键释放后,对于快速键入的用户,这应该会清除计时器)500毫秒后才对事件做出反应