2015-10-06 55 views
-1

觸發事件我有附加這樣的Keylistener一個JTextfield的KeyListener不JTextField中

field.addKeyListener(new KeyAdapter() { 

     @Override 
     public void keyPressed(KeyEvent e) { 
      log.debug("KEY PRESSED"); 
     } 

     @Override 
     public void keyTyped(KeyEvent e) { 
      log.debug("KEY TYPED"); 
     } 

     @Override 
     public void keyReleased(KeyEvent e) { 
      log.debug("KEY RELEASED"); 
     } 
}); 

但是當我鍵入某些鍵我可以看到keyReleased並不總是射擊。我不能鍵入任何鍵直接事後,如果它不火,我必須再次點擊進入該文本字段或鍵入另一個鍵獲得釋放事件觸發(輸入的密鑰不是在文本字段中顯示)。我沒有使用Keys做任何事情,沒有事件被消耗。感覺就像事件被隨機發射一樣。同樣的情況與KeyListener,而不是KeyAdapter

field.addKeyListener(new KeyListener() { 

我使用Linux 64位,但這也發生在Win8中和Win10 64位。還嘗試了不同的鍵盤和不同的電腦。

我怎樣才能得到事件觸發正確?當我按例如箭頭鍵發生

+2

不要使用'KeyListener'與文本組件,請使用'DocumentListener'而不是 – MadProgrammer

+1

哪些鍵會導致問題?當您在文本字段中註冊「KeyListener」時,鍵入的鍵必須位於文本字段中。例如。 'TAB'可能會將焦點轉移到下一個組件上。 – hotzst

+0

@hotzst它發生在任何包括數字的a-z鍵上。 –

回答

0

特別活動。

Swing組件使用Key Bindings將Actions與KeyStrokes相關聯。

一個JTextField已經與「方向鍵」關聯的默認操作。如果要更改此行爲,則需要爲這些鍵創建自定義操作以替換默認操作。

退房鍵綁定爲每個Swing組件的默認綁定的列表。

你應該通過擴展TextAction

static class SelectAll extends TextAction 
{ 
    public SelectAll() 
    { 
     super("Select All"); 
    } 

    public void actionPerformed(ActionEvent e) 
    { 
     JTextComponent component = getFocusedComponent(); 
     component.selectAll(); 
     component.requestFocusInWindow(); 
    } 
} 

創建行動,那麼,你可以這樣綁定到你的文本字段的左方向鍵使用:

Action action = new SelectAll(); 
KeyStroke keyStroke = KeyStroke.getKeyStroke("LEFT"); 
InputMap im = textField.getInputMap(); 
textField.getActionMap().put(im.get(keyStroke), action);