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

将JTextField的输入限制为双数?

孟英光
2023-03-14

在java中,我试图制作简单的货币转换器,但为此,我需要一个文本字段,它可以将输入限制为仅数字,更重要的是双数字。我尝试过使用jFormattedTextField,但它只在您完成输入并单击其他位置后格式化输入,但我需要限制TextField在输入时使用()每个无效字符。

可能的尝试:

使用JFormatedTextField

JFormatedTextField textField = new JFormatedTextField(new DoubleFormat());
textField.setBounds(190, 49, 146, 33);
frame.getContentPane().add(textField);
textField.setColumns(10);

使用KeyType事件

char c = arg0.getKeyChar();
if(!(Character.isDigit(c) || c == KeyEvent.VK_BACK_SPACE || c== KeyEvent.VK_DELETE)){
    arg0.consume();
}

使用KeyType事件与regex:

if(!((textField.getText().toString+arg0.getKeyChar()).matches("[0-9]*(.[0-9]*)?"))){
   arg0.consume();
}

第二次和第三次尝试很接近,但是第二次尝试在点值上失败了,第三次尝试总是读文本字段上的第一个字符,不管它是什么,所以有什么建议吗?我不是很喜欢JAVA GUI,所以请耐心等待。

共有3个答案

孟宏才
2023-03-14

您可以在文本字段中添加一个键侦听器,并实现keyReleased()方法,以确定用户每次击键后文本字段中的值是否为双精度。

public class CurrencyJTF extends JFrame {
JButton jButton = new JButton("Unfocus");
final JFormattedTextField textField = new JFormattedTextField(new DecimalFormat());
double lastDouble = 0.0;

public CurrencyJTF() throws HeadlessException {
    textField.setColumns(20);
    textField.setText(lastDouble + "");

    this.setLayout(new FlowLayout());

    this.add(textField);
    this.add(jButton);

    textField.addKeyListener(new KeyAdapter() {
        @Override
        public void keyReleased(KeyEvent e) {
            handleKeyReleased();
        }
    });
}

private void handleKeyReleased() {
    String text = textField.getText();
    if (text.isEmpty()) return;

    try {
        lastDouble = Double.parseDouble(text);
    } catch (NumberFormatException ex) {
        textField.setText(lastDouble + ""); // or set to other values you want
    }
}

public static void main(String[] args) {
    JFrame frame = new CurrencyJTF();
    frame.setVisible(true);
    frame.pack();
}
}
华宣
2023-03-14

您需要使用文档过滤器。阅读Swing教程中关于实现DocumentFilter的部分,以获取入门示例。

您的实现将更加复杂,因为您需要获取文档中已有的文本,然后将新文本插入字符串中的适当位置,然后调用Double。parseDouble(…)以确保它是有效的双精度值。

如果验证成功,那么您继续插入,否则您可以生成哔哔声。

汤飞
2023-03-14

如果知道小数点前后的位数,也可以使用MaskFormatter。例如:

JFormattedTextField field = new JFormattedTextField(getMaskFormatter("######.##"));

(...)

private MaskFormatter getMaskFormatter(String format) {
    MaskFormatter mask = null;
    try {
        mask = new MaskFormatter(format);
        mask.setPlaceholderCharacter('0');
    }catch (ParseException ex) {
        ex.printStackTrace();
    }
    return mask;
}

然而,它将显示一个JTextField,因此它将始终可见000000.00

编辑

另一种方法,不太优雅,但在我看来是有效的。试着用DecumentListener,也许它会适合你的需要:

field = new JFormattedTextField();
field.getDocument().addDocumentListener(new DocumentListener() {
    @Override
    public void insertUpdate(DocumentEvent e) {
        Runnable format = new Runnable() {
            @Override
            public void run() {
                String text = field.getText();
                if(!text.matches("\\d*(\\.\\d{0,2})?")){
                    field.setText(text.substring(0,text.length()-1));
                }
            }
        };
        SwingUtilities.invokeLater(format);
    }

    @Override
    public void removeUpdate(DocumentEvent e) {

    }

    @Override
    public void changedUpdate(DocumentEvent e) {

    }
});

我使用正则表达式:\\d*(\\.\\d{0,2}) 因为两个小数位对于货币来说就足够了。

 类似资料:
  • 问题内容: 我知道这个问题一定已经被提出并回答了一百万遍了,但是我找不到一个简单的解决方案。我有一个JTextField,它只接受正整数作为输入。我需要一种方法来确保此处没有其他输入。 我已经有一个附加到此控件。删除此侦听器在那里要处理的其他代码,我得到了: 如你所见,我正在尝试使用来检查刚刚按下的键是否在整数范围内。这似乎有效。但是我想做的就是,如果该条目不在此范围内,则只需忽略该条目。该代码本

  • 问题内容: 我想创建JTextField,输入字符限于“ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVXYWZZ0123456789 +&@#/%?=〜_- |!:,。;”之类的输入字符。所以我尝试覆盖 但这不是我想要的,因为用户无法再按ctrl-c ctrl-v ctrl-x …所以我添加了 到if条件,但现在用户可以粘贴不适当的输入,即’(’

  • 我试图限制用户可以在文本字段中输入的字符的最大长度,但似乎不起作用。 以下是代码: 我做错什么了吗?我怎样才能使限制正常工作?

  • 问题内容: 我是JAVA的新手,我正在尝试将JTextField的输入转换为整数,我尝试了很多选项,但是没有任何作用,蚀总是给我一个错误,并且这些错误对我来说没有意义。 导入java.awt.Graphics; 导入java.awt.Color; 问题答案: 代替: 试试这个: 您不能解析为,但是 可以解析 其包含的 值 -文本。

  • 下面是关于如何限制字符输入长度的代码 可以通过

  • 问题内容: 我试图在下面的字段中限制输入为数字 它不适用于 它适用于以下代码,但同时更改了两个字段 需要更改用户正在输入的输入字段的值,而不是两者都更改 问题答案: 使用此处找到的指令:而不是ng-change函数。复制此处以方便参考: