2015-10-06 27 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);