2012-06-08 18 views
0

中按下的重複向下箭頭鍵在JTable上,反覆按下向下箭頭鍵時,會快速連續觸發多個KeyEvent。我的要求是我只需要在最後KeyEvent上採取行動。我試圖在KeySelectionListener中使用TimerTask,但它給出了不確定的結果。在Jtable

任何想法可以做什麼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); 



     } 
    }); 

感謝

+0

我們看一些代碼。 –

+0

你需要收到最後的關鍵事件之後一再改變其選擇之後,一些reapeatedly觸發的事件,或最後一個表選擇的事件嗎?那是兩個完全不同的情況我在問,因爲在Swing中沒有可用的「KeySelectionListener」 - 它是你自己的類 –

+0

我的壞。我的意思是KeyListener。 – niteen22

回答

2

Timer的想法(我強烈建議,因爲你與Swing組件交互使用javax.swing.Timer類)應該工作。

只需將重複設置爲false,當定時器未運行時收到按鍵時啓動定時器,或者定時器已在運行時重新啓動定時器。這會導致最後一個鍵的處理(延遲=您在定時器上設置的延遲)稍微延遲,但避免您在每個鍵擊中發生反應。

+0

Swing Action已經實現了阻止/允許自己事件的方法,當然是Swing Timer的輸出,或擺動計時器也有延遲(@Robin歡迎> 10k用戶) – mKorbel

0

我僅使用了定時器。我在監聽器中維護KeyEvent的引用,並且如果在預定義的延遲中接收到另一個KeyEvent(爲了測試保持它1秒),則引用新事件。因此,當1秒內沒有新的keyEvent時,最後引用的事件將用於進一步處理。它現在工作。隨時提出您的意見。

addKeyListener(新的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); 
      } 
    });