字符串生成器的问题:在 Java Swing JTextField 中过滤字符

问题描述 投票:0回答:1

我对 Java 和 stackoverflow 还很陌生。 如果我犯了错误或者我提供的信息不足,请提醒我。

我正在开发一个 Java Swing 项目,并尝试使用自定义 DocumentFilter 类来监视和过滤 JTextField 中的输入。具体来说,我想确保只能输入三位数字和某些特殊字符(-、逗号)。

这是我写的课程:

import javax.swing.*;
import javax.swing.text.*;

public class NumberOnlyField extends JTextField {

    public NumberOnlyField() {
        PlainDocument doc = (PlainDocument) getDocument();
        doc.setDocumentFilter(new NumberOnlyFilter());
    }

    private class NumberOnlyFilter extends DocumentFilter {

        @Override
        public void insertString(FilterBypass fb, int offset, String string, AttributeSet attr)
                throws BadLocationException {
            if (string == null) {
                return;
            }

            super.insertString(fb, offset, onlynumbers(string), attr);
        }

        @Override
        public void replace(FilterBypass fb, int offset, int length, String text, AttributeSet attrs)
                throws BadLocationException {
            if (text == null) {
                return;
            }

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

    private String onlynumbers(String string) {
        StringBuilder builder = new StringBuilder(string);
        for (int i = builder.length() - 1; i >= 0; i--) {
            char ch = builder.charAt(i);
            if ((!Character.isDigit(ch) && ch != '-' && ch != ',') || i > 3) {
                builder.deleteCharAt(i);
            }
        }
        return string;
    }
}

这里使用TextField:

JTextField minRain = new NumberOnlyField();
        minRain.setBounds(155, 130, 35, 20);
        add(minRain);
        minRain.setColumns(10);

过滤器根本不起作用。文本字段正常显示,没有发生错误,我可以在其中写入任何内容。鉴于其简单的性质,我正在努力找出我可能做错了什么。

java swing jtextfield stringbuilder documentfilter
1个回答
0
投票

A

DocumentFilter
当然是一种方法,但如果您擅长切换装置,那么仅使用
DocumentListener
可能会更容易。这样工作量就少了。

这是一个快速、简单的示例。


final JTextField textField = new JTextField();
final DocumentListener listener = 
   new DocumentListener()
   {

      public void insertUpdate(final DocumentEvent event)
      {
         yourValidationMethod(event);            
      }
               
      public void changedUpdate(final DocumentEvent event) {}
               
      public void removeUpdate(final DocumentEvent event)
      {
         yourValidationMethod(event);
      }

      private void yourValidationMethod(final DocumentEvent event)
      {
         final String string = event.getDocument().getText(0, event.getDocument().getLength());
         //do validations on this string
      }

   };

textField.getDocument().addDocumentListener(listener);

我还看到您正在尝试编辑文本。通常情况下,人们只是提出一些警告,指出文本不好,但这没关系。在这里也很容易做到。只需使用

Document#remove(int offset, int length)
。因此,如果有人输入
1
,然后输入
2
,然后输入
f
,您只需得到偏移量,即文档中最后一个字符的索引,然后得到长度,即1,既然你只想删除最后一个字符,那么将这 2 个插入到方法中,就可以了。

© www.soinside.com 2019 - 2024. All rights reserved.