【问题标题】:Only numbers and one decimal point allow on jtextfield in java [duplicate]java中的jtextfield只允许数字和一个小数点[重复]
【发布时间】:2013-08-08 18:59:42
【问题描述】:
  1. 在我的 java 表单中有一个 jtextfield。我不想让输入 alpha(Characters) 并且只允许输入数字。

  2. 并且不能输入2个小数点和小数点后的2个数字。(那个jtextfield的价格..)

请告诉我如何一步一步地做到这一点。

【问题讨论】:

  • 你已经尝试了什么?

标签: java swing numbers filtering jtextfield


【解决方案1】:

请告诉我如何一步一步地做到这一点。

  1. 将 JFormattedTextField 与 NumberFormatter 一起使用

    • 限制小数位数

    • 设置各种 RoundingModes

    • 限制范围,设置最小值和/或最大值

  2. 另一种方法是使用JSpinner和SPinnerNUmberModel,但需要使用DocumentFilter

例如

import java.awt.*;
import java.awt.font.TextAttribute;
import java.math.*;
import java.text.*;
import java.util.Map;
import javax.swing.*;
import javax.swing.JFormattedTextField.*;
import javax.swing.event.*;
import javax.swing.text.InternationalFormatter;

public class DocumentListenerAdapter {

    public DocumentListenerAdapter() {
        JFrame frame = new JFrame("AbstractTextField Test");
        final JFormattedTextField textField1 = new JFormattedTextField(new Float(10.01));
        textField1.setFormatterFactory(new AbstractFormatterFactory() {
            @Override
            public AbstractFormatter getFormatter(JFormattedTextField tf) {
                NumberFormat format = DecimalFormat.getInstance();
                format.setMinimumFractionDigits(2);
                format.setMaximumFractionDigits(2);
                format.setRoundingMode(RoundingMode.HALF_UP);
                InternationalFormatter formatter = new InternationalFormatter(format);
                formatter.setAllowsInvalid(false);
                //formatter.setMinimum(0.0);
                //formatter.setMaximum(1000.00);
                return formatter;
            }
        });
        final Map attributes = (new Font("Serif", Font.BOLD, 16)).getAttributes();
        attributes.put(TextAttribute.STRIKETHROUGH, TextAttribute.STRIKETHROUGH_ON);
        final JFormattedTextField textField2 = new JFormattedTextField(new Float(10.01));
        textField2.setFormatterFactory(new AbstractFormatterFactory() {
            @Override
            public AbstractFormatter getFormatter(JFormattedTextField tf) {
                NumberFormat format = DecimalFormat.getInstance();
                format.setMinimumFractionDigits(2);
                format.setMaximumFractionDigits(2);
                format.setRoundingMode(RoundingMode.HALF_UP);
                InternationalFormatter formatter = new InternationalFormatter(format);
                formatter.setAllowsInvalid(false);
                //formatter.setMinimum(0.0);
                //formatter.setMaximum(1000.00);
                return formatter;
            }
        });
        textField2.getDocument().addDocumentListener(new DocumentListener() {
            @Override
            public void changedUpdate(DocumentEvent documentEvent) {
                printIt(documentEvent);
            }

            @Override
            public void insertUpdate(DocumentEvent documentEvent) {
                printIt(documentEvent);
            }

            @Override
            public void removeUpdate(DocumentEvent documentEvent) {
                printIt(documentEvent);
            }

            private void printIt(DocumentEvent documentEvent) {
                DocumentEvent.EventType type = documentEvent.getType();
                double t1a1 = (((Number) textField2.getValue()).doubleValue());
                if (t1a1 > 1000) {
                    Runnable doRun = new Runnable() {
                        @Override
                        public void run() {
                            textField2.setFont(new Font(attributes));
                            textField2.setForeground(Color.red);
                        }
                    };
                    SwingUtilities.invokeLater(doRun);
                } else {
                    Runnable doRun = new Runnable() {
                        @Override
                        public void run() {
                            textField2.setFont(new Font("Serif", Font.BOLD, 16));
                            textField2.setForeground(Color.black);
                        }
                    };
                    SwingUtilities.invokeLater(doRun);
                }
            }
        });
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(textField1, BorderLayout.NORTH);
        frame.add(textField2, BorderLayout.SOUTH);
        frame.setVisible(true);
        frame.pack();
    }

    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                DocumentListenerAdapter main = new DocumentListenerAdapter();
            }
        });
    }
}

【讨论】:

    【解决方案2】:

    如果您只想输入数字,请尝试此代码textfield

    txtfield.addKeyListener(new java.awt.event.KeyAdapter() {
        public void keyTyped(KeyEvent e) {
            char c = e.getKeyChar();
            if (!((c >= 0) && (c <= 9) || (c == KeyEvent.VK_BACK_SPACE) || (c == KeyEvent.VK_DELETE))) {
                getToolkit().beep();
                e.consume();
            }
        }
    });
    

    txtfield初始化之后将上面的代码粘贴到你的构造函数中

    也看看这个东西JFormattedTextField for Double still takes characters

    【讨论】:

    • 不好的方法。粘贴错误的内容怎么办?
    • 我可以建议用Character.isDigit(c) 替换(c &gt;= 0) &amp;&amp; (c &lt;= 9) 吗?
    • -1 这种方法有很多问题。小数点或负号(但不是两者的倍数,它们必须在逻辑位置)呢?
    • 我把这个线程留给鲸鱼,带有 NumberFormatter 的 JFormattedTextField 与带有 DocumentFilter 的 JTextField 相同,问题仅在于带有 SpinnerNumberModel 的 JSpinner(Editor 是 JTextField),需要添加 DocumentListener
    【解决方案3】:

    JFormattedTextField 与 NumberFormat 一起使用(请参阅for example)。或者,您可以将自己的 DocumentFilter 添加到您的 JTextField 的文档中

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-30
      • 2012-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-12
      • 1970-01-01
      相关资源
      最近更新 更多