【问题标题】:How can I get the length of a JTextField's contents as the user types?当用户键入时,如何获取 JTextField 内容的长度?
【发布时间】:2008-12-30 21:41:38
【问题描述】:

JTextField 有一个 keyTyped 事件,但似乎在它触发时单元格的内容还没有改变。

因为如果在这里阅读 .length() 总是错误的。

必须有一种简单的方法来获取用户击键后显示的长度吗?

【问题讨论】:

    标签: java swing events jtextfield


    【解决方案1】:

    这可能不是最佳方式(而且已经有一段时间了),但在过去,我已将 DocumentListener 添加到 JTextField 和任何事件(插入、更新、删除)上我:

    evt.getDocument().getLength()
    

    返回文本字段内容的总长度。

    【讨论】:

      【解决方案2】:

      这可能和这个"bug" (or rather "feature")有关

      在处理关键事件之前,会通知侦听器 允许侦听器通过消费事件来“窃取”事件。这给 与消费事件的旧 awt 概念兼容。
      “类型化” 事件并不意味着文本被输入到组件中。这不是一个 错误,这是预期的行为。

      一个可能的解决方案是收听associated Document

      // Listen for changes in the text
      myTextField.getDocument().addDocumentListener(new DocumentListener() {
        public void changedUpdate(DocumentEvent e) {
        // text was changed
      }
      public void removeUpdate(DocumentEvent e) {
        // text was deleted
      }
      public void insertUpdate(DocumentEvent e) {
        // text was inserted
      }
      });
      

      请注意,无论文本如何更改,这都有效;通过剪贴板剪切/粘贴、TextField 上的程序化“setText()”或用户在 UI 上的字段中键入。

      【讨论】:

        【解决方案3】:

        KeyEvents 是低级事件,在这里不合适[听起来很熟悉]。

        JTextField 系统如何知道输入了一个字符?通过键类型事件(IIRC,通过 PL&F 完成)。事件是否在您的侦听器之前被分派到系统侦听器?它可能会也可能不会。

        在这种情况下,您可能希望转到Document 并添加更高级别的侦听器。对于 Swing,尽早选择模型是个好主意——“J”类接口是不连贯的。如果您正在拦截输入数据,那么您可能需要一个自定义模型(或者在 Document 的情况下为 DocumentFilter)。

        【讨论】:

          【解决方案4】:

          使用此代码:

          public void jTextField6KeyReleased(java.awt.event.KeyEvent evt)
          {
              System.out.println(jTextField6.getText().length());
          }
          

          【讨论】:

          • 考虑扩大你的答案,向提问者解释为什么这会达到预期的结果,可能链接到文档。事实上,这只是微不足道的用处。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-09-17
          • 2011-12-13
          • 1970-01-01
          • 2022-07-02
          • 1970-01-01
          • 1970-01-01
          • 2021-12-07
          相关资源
          最近更新 更多