KeyListener在JTextField之前接收到了“按键事件”?

4
我有一个JTextField,并向该字段添加了Keylistener。在keyPressed方法内,我要求该方法打印JTextField中的内容(System.out.println)。如果我按字母键,似乎Keylistener在JTextField更新之前接收到此键击。我必须按两个字母才能看到第一个字母。
我只需要在每个输入的字母大写即可。我正在尝试通过监听每个键(我还监听ENTER键以进行其他操作),然后执行textfield.setText(textfield.getText()。toUpperCase())来实现这一点。

为什么不能向JTextField添加监听器? - Michael Myers
"..并且我已经添加了一个KeyListener到该字段" - user89862
咦。 :) 我以为你在使用全局 KeyListener。 - Michael Myers
3个回答

4

使用文档过滤器在输入时更改文本。

这不是最美观的源码,也不是100%正确的,只是展示了它的工作原理。在此处查看原始内容

((AbstractDocument)textField.getDocument()).setDocumentFilter(new UppercaseDocumentFilter());

  class UppercaseDocumentFilter extends DocumentFilter {
        public void insertString(DocumentFilter.FilterBypass fb, int offset,
                                 String text, AttributeSet attr)
                throws BadLocationException {

            fb.insertString(offset, text.toUpperCase(), attr);
        }

        public void replace(DocumentFilter.FilterBypass fb, int offset, int length,
                            String text, AttributeSet attrs)
                throws BadLocationException {

            fb.replace(offset, length, text.toUpperCase(), attrs);
        }
    }

2

我知道自问自答并不是很受欢迎,但是我想我找到了解决方案。与其在keyPressed方法中进行所有的大写转换,我选择在keyReleased方法中进行。


0

尝试使用底层文档:

textfield.getDocument().addDocumentListener(yourListener);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接