在Jtable中按下重复的向下箭头键

时间:2012-06-08 09:19:16

标签: java swing jtable keylistener

JTable上,当反复按下向下箭头键时,会快速连续触发多个KeyEvent。我的要求是我只需要在最后KeyEvent采取行动。我想在TimerTask中使用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);



        }
    });

由于

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

我只使用了Timer。我在监听器中维护了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);
          }
    });