当前位置: 首页 > 知识库问答 >
问题:

如何在Java中创建一个只能接受数字和一次点的字段?

宗政霄
2023-03-14

我看遍了整个网络,所有我尝试过的东西都没用。。。。

我发现我可以使用一些JTextFormatterField,但它不起作用。

然后我发现我可以将DocumentFilter与正则表达式一起使用,我所做的是:

JTextField jFormattedTextFieldMoneyToConvert = new JTextField();
    ((AbstractDocument) jFormattedTextFieldMoneyToConvert.getDocument()).setDocumentFilter(new DocumentFilter(){
        Pattern regEx = Pattern.compile("^\\d+\\.?\\d*$");

        @Override
        public void replace(FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException {
            Matcher matcher = regEx.matcher(text);
            if (!matcher.matches()) {
                return;
            }
            super.replace(fb, offset, length, text, attrs);
        }
    });

但它不起作用。。。它只接受数字。我希望它也能接受点。我还需要它不要以点开头,也不要以点结尾。

我做错了什么?

共有2个答案

单展
2023-03-14

不久前我遇到了类似的问题。问题不在于正则表达式,而是我对过滤器工作原理的误解。我的假设,和你一样,传递给替换方法的String text是整个字符串,而实际上它只是正在键入的字符。这里有类似的讨论。

虽然@Bohemian的所有正则表达式功夫可能都是你想要的匹配正则表达式(我不知道,这不是我的强项),但问题(假设)可以通过获取整个文档文本来解决,然后尝试匹配,即。

String completeText = fb.getDocument().getText(0, fb.getDocument().getLength());

“我还需要它不要以点开头,也不要以点结尾”

逻辑地思考一下。为每个字符输入调用过滤器。但你不想以结尾 但您希望允许 中间的某个地方。不允许 结尾否定出现的可能性 在下一个数字之前的末尾

您可能只需要编写一个焦点侦听器来添加0或删除当字段失去焦点时,如果用户留下挂起的

更新:完整示例

import java.awt.*;
import javax.swing.*;
import javax.swing.text.*;

public class FilterDemo {

    public FilterDemo() {
        JFrame frame = new JFrame();
        frame.setLayout(new GridBagLayout());
        frame.setSize(300, 300);
        frame.add(createFilteredField());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationByPlatform(true);
        frame.setVisible(true);

    }

    private JTextField createFilteredField() {
        JTextField field = new JTextField(20);
        AbstractDocument document = (AbstractDocument) field.getDocument();
        final int maxCharacters = 10;
        document.setDocumentFilter(new DocumentFilter() {
            @Override
            public void replace(FilterBypass fb, int offs, int length,
                    String str, AttributeSet a) throws BadLocationException {

                String text = fb.getDocument().getText(0,
                        fb.getDocument().getLength());
                text += str;
                if (text.matches("^\\d+\\.?\\d*$")) {   //  "^[0-9]+[.]?[0-9]{0,}$"
                    super.replace(fb, offs, length, str, a);
                } else {
                    Toolkit.getDefaultToolkit().beep();
                }

            }

            @Override
            public void insertString(FilterBypass fb, int offs, String str,
                    AttributeSet a) throws BadLocationException {

                String text = fb.getDocument().getText(0,
                        fb.getDocument().getLength());
                text += str;
                if (text.matches("^\\d+\\.?\\d*$")) {
                    super.insertString(fb, offs, str, a);
                } else {
                    Toolkit.getDefaultToolkit().beep();
                }
            }
        });
        return field;
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new FilterDemo();
            }
        });
    }
}

朱翔
2023-03-14

这可能是最简单的代码:

if (text.matches("\\d+(\\.\\d+)?"))

如果有点,后面必须跟一些数字。如果你想允许一个点,那么也不要数字,把改成*

if (text.matches("\\d+(\\.\\d*)?"))

请注意,对于String#matches(),前导/尾随^/$是不必要的,因为整个字符串必须匹配matches()才能返回true

不允许前导数字也变得更加棘手,因为正则表达式(\d)?(\。\d*)匹配空白字符串,因此需要替换:

if (text.matches("\\d+(\\.\\d*)?|\\.\\d+"))

或者是消极的展望:

if (text.matches("(?!$)\\d*(\\.\\d*)?"))

little look head断言开始后的下一个位置不是结束(即输入不是空的)。

 类似资料:
  • 我有一个文本字段,我只接受键盘上的数字,但现在我必须更改它,因为它是“价格文本字段”,我还需要接受一个点”。“对于任何价格。 我怎样才能改变这个以得到我需要的?

  • 我希望我的文本字段只接受数字(数字)和一个点,因为这是一个用户可以在其中写入产品价格的字段。我有这个代码,但它不能很好地工作,它只接受数字和删除。 有人能帮我修一下吗?

  • 我正在开发一个数独小程序,我想制作它的单元格(扩展JTextField),以便它只接受0-9和长度为1之间的整数。稍后我会对它进行更多限制(以便它符合游戏规则)。我从: 在这里,我试图过滤输入,对于开始,我只是试图将其限制为整数和一个数字,但似乎我可以输入任意多的数字,而最后一行不会被触发。 想在这里得到一些帮助,谢谢:

  • 我正在用JavaStruts开发一个博客,我想知道什么时候打开一篇文章(所有记录都由数据库显示),而不是如何让链接看到下一篇文章和上一篇文章。 请帮我做链接。

  • 如何将数字(0-255内的随机整数)转换为二进制并将位存储为8位数组。(java)

  • 本文向大家介绍如何限制UITextField在Swift中只接受数字?,包括了如何限制UITextField在Swift中只接受数字?的使用技巧和注意事项,需要的朋友参考一下 在iOS应用中,有时我们需要将文本字段限制为仅将数字作为输入,这可以通过多种方式完成,下面让我们来看一些。 方法1:从情节提要中更改文本字段类型。 选择要限制为数字输入的文本字段。 转到其属性检查器。 选择键盘类型,然后从中