如何限制用户只输入数字?

时间:2012-03-23 07:51:00

标签: java user-interface numbers

我目前正在创建这个java GUI,要求用户输入10个条目,然后使用这些值来执行下一个操作。

我希望只输入数字或小数点,使其只能是浮点值。

如果它不是数字或小数点,它应该提示用户在执行下一个动作之前再次输入该特定条目。

我该怎么做?

2 个答案:

答案 0 :(得分:2)

Wong,

不确定您是否使用Swing ......

年龄前我遇到了同样的问题,我通过创建一个扩展JTextField的类RestrictedTextField来解决它。在构造函数中我添加了一个键侦听器(addKeyListener(new RestrictedKeyAdapter());)

private class RestrictedKeyAdapter extends KeyAdapter {

    @Override
    public void keyReleased(KeyEvent e) {

        if (getText().equals("")) {
            oldString = "";
            return;
        } else {
            // if you cannot parse the string as an int, or float, 
            // then change the text to the text before (means: ignore
            // the user input)
            try {
                if (type.equals("int")) {
                    int i = Integer.parseInt(getText());
                    oldString = getText();
                } else if (type.equals("float")) {
                    float f = Float.parseFloat(getText());
                    oldString = getText();
                } else {
                    // do nothing
                }
            } catch (NumberFormatException el) {
                setText(oldString);
            }

            // if the text is identical to the initial text of this
            // textfield paint it yellow. If the text was changed
            // paint it red.
            if (initialString.equals(getText())) {
                setForeground(Color.YELLOW);
            } else {
                setForeground(Color.RED);
            }
        }
    }
}

这个想法是,每当用户按下文本字段中的某个键(然后释放它)时,就会解析文本字段中的文本。例如,如果组件只接受浮点数,那么组件会尝试将其解析为float(Float.parseFloat(..))。如果这个解析成功,一切都很好。如果解析失败(抛出NumberFormatException),则旧文本将被写回文本字段(字面意思是忽略用户输入)。

我认为您可以直接将KeyAdapter添加到JTextField而无需为其创建专用类,但使用此解决方案,您可以记住初始字符串和旧字符串。

您可以使用代码..如果输入有效,您可以更改文本字段的颜色(或者如果文本与初始字符串相同,则可以在我的代码段中更改)。

另外一条注释:我在一个名为'type'的变量中设置textfield的'type',这只是一个字符串,其值为“int”,“float”等....更好的解决方案例如,这里会是一个枚举...

我希望这有用......

蒂莫

答案 1 :(得分:1)

您想要做的事情有多种选择。您可以查看here这样做的一个示例。另一个例子可能是使用Formatted TextFields,如here所示。

另一方面,提交后,您可以尝试将值解析为floatdouble。如果您得到任何例外,则该值不是数字。

最后,您可以使用正则表达式。诸如^\\d+(\\.\\d+)?$之类的表达式应该匹配任何整数或浮点数。