我有JTextfield
Keylistener
,如下所示:
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 64bit,但这也出现在Win8和Win10 64bit上。还试过不同的键盘和不同的电脑。
如何正确启动事件?
答案 0 :(得分:0)
按下例如箭头键时必须发生的特殊事件。
Swing组件使用Key Bindings将Actions与KeyStrokes相关联。
JTextField已经具有与"箭头键"相关联的默认操作。如果要更改此行为,则需要为这些键创建自定义操作以替换默认操作。
查看Key Bindings以获取每个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);