0

On JTable,当反复按下向下箭头键时,会快速连续触发多个 KeyEvent。我的要求是我只需要对 last 采取行动KeyEvent。我正在尝试使用TimerTaskin KeySelectionListener,但它给出了不确定的结果。

知道可以进行哪些更改KeyListener吗?

示例代码 -

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("Selected-- "+getModel().getValueAt(getSelectedRow(), 2));
                }
            };

           // t.scheduleAtFixedRate(tt, 0, 500);
            t.schedule(tt, 0, 200);



        }
    });

谢谢

4

2 回答 2

2

带有 a 的想法Timer(我强烈建议使用javax.swing.Timer该类,因为您与 Swing 组件交互)应该可行。

只需将重复设置为false,如果计时器未运行,则在收到击键时启动计时器,或者在计时器已运行时重新启动计时器。这将导致对最后一个键的处理稍有延迟(延迟 = 您在计时器上设置的延迟),但要避免您对每个按键做出反应

于 2012-06-08T12:15:15.583 回答
0

我只使用了定时器。我在侦听器中维护了 KeyEvent 的引用,如果在预定义的延迟中收到另一个 KeyEvent(测试保持 1 秒),则引用新事件。因此,当 1 秒内没有新的 keyEvent 时,将使用最后引用的事件进行进一步处理。它现在工作。随意提出你的意见。

addKeyListener(new KeyListener() {

        KeyEvent eventToProcess;
        Timer t = new Timer();
        TimerTask tt;


        @Override
        public void keyTyped(KeyEvent e) {

        }

        @Override
        public void keyPressed(KeyEvent e) {

            if(tt != null){
                tt.cancel();
                tt = null;
            }


        }

        @Override
        public void keyReleased(KeyEvent e) {

            eventToProcess = e;

            tt = new TimerTask() {
                @Override
                public void run() {

                    System.out.println("Selected-- "+getModel().getValueAt(getSelectedRow(), 2)+"  Key Event > "+eventToProcess.getKeyChar());
                }
            };

            t.schedule(tt, 1000);
          }
    });
于 2012-06-14T09:53:22.380 回答