【问题标题】:KeyListener receives the "key-hit" before my JTextField does..?KeyListener 在我的 JTextField 之前收到“key-hit”......?
【发布时间】:2011-01-11 18:42:36
【问题描述】:

我有一个JTextField,并在该字段中添加了一个Keylistener。在keyPressed 方法内,我要求该方法打印(System.out.printlnJTextField 内的内容。如果我击中一个字母,似乎KeylistenerJTextField 之前收到此键击更新了..我必须打两个字母才能看到第一个..

我需要做的就是在输入每个字母时将它们设为大写。我试图通过听每个键来做到这一点(出于其他原因,我也听 ENTER 键)然后做一个@ 987654328@

【问题讨论】:

  • 为什么不能给 JTextField 添加监听器?
  • ".. 并在该字段中添加了一个 KeyListener"
  • 呃。 :) 我以为您使用的是全局 KeyListener。

标签: java swing keylistener


【解决方案1】:

使用DocumentFilter 更改输入的文本。

不是最漂亮的来源,也不是 100% 正确,只是展示了它的工作原理。 See the original here

((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】:

    尝试使用底层文档:

    textfield.getDocument().addDocumentListener(yourListener);
    

    【讨论】:

      【解决方案3】:

      我知道回答你自己的问题不太受欢迎.. 但我想我找到了解决方案.. 我没有在 keyPressed 方法中做所有大写,而是在 keyReleased 中做:)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-18
        • 1970-01-01
        • 2015-02-21
        • 1970-01-01
        • 1970-01-01
        • 2013-10-14
        相关资源
        最近更新 更多