如何仅在文本字段中输入数字[重复]

Posted

技术标签:

【中文标题】如何仅在文本字段中输入数字[重复]【英文标题】:how to make input in Textfield only Numeric [duplicate] 【发布时间】:2015-09-19 04:23:56 【问题描述】:

我制作了一个计算器,其中包含 2 个文本字段,数字 1 和数字 2 和 4 用于操作 +、-、x 和 / 的按钮,以及一个用于结果的文本字段,我想让文本字段中的数字 1 和 2 的输入成为仅数字,当我在结果字段中显示字母消息时输入无效提前感谢您的帮助,如果使用正则表达式的解决方案并且我想保存整个操作以便能够再次加载,我已经为 SAVE 制作了 jbuttons,这会更好,加载

这是我的代码有什么修改吗?

import java.awt.BorderLayout;

public class MainWindow extends JFrame 

private JPanel contentPane;
private JTextField txtNumber1;
private JTextField txtAnswer;
private JTextField txtNumber2;
private JButton sub;
private JButton mul;
private JButton div;
private JButton add;

/**
 * Launch the application.
 */
public static void main(String[] args) 
    String LookAndFeel = UIManager.getSystemLookAndFeelClassName();
    try 
        UIManager.setLookAndFeel(LookAndFeel);
     catch (ClassNotFoundException e1) 
        // TODO Auto-generated catch block
        e1.printStackTrace();
     catch (InstantiationException e1) 
        // TODO Auto-generated catch block
        e1.printStackTrace();
     catch (IllegalAccessException e1) 
        // TODO Auto-generated catch block
        e1.printStackTrace();
     catch (UnsupportedLookAndFeelException e1) 
        // TODO Auto-generated catch block
        e1.printStackTrace();
    
    EventQueue.invokeLater(new Runnable() 
        public void run() 
            try 
                MainWindow frame = new MainWindow();
                frame.setVisible(true);
             catch (Exception e) 
                e.printStackTrace();
            
        
    );


/**
 * Create the frame.
 */
public MainWindow() 
    setResizable(false);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setBounds(100, 100, 430, 263);
    contentPane = new JPanel();
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    setContentPane(contentPane);
    contentPane.setLayout(null);

    JLabel lblNumber1 = new JLabel("Number 1:");
    lblNumber1.setBounds(21, 44, 80, 14);
    contentPane.add(lblNumber1);

    txtNumber1 = new JTextField();
    txtNumber1.setBounds(102, 38, 100, 26);
    contentPane.add(txtNumber1);
    txtNumber1.setColumns(10);

    JLabel lAnswer = new JLabel("Answer :");
    lAnswer.setBounds(21, 181, 80, 14);
    contentPane.add(lAnswer);

    txtAnswer = new JTextField();
    txtAnswer.setBounds(102, 175, 100, 26);
    contentPane.add(txtAnswer);
    txtAnswer.setColumns(10);

    JButton btnSave = new JButton("Save");
    btnSave.addActionListener(new ActionListener() 
        public void actionPerformed(ActionEvent arg0) 
            JFileChooser fc = new JFileChooser();
            fc.showSaveDialog(MainWindow.this);
            File f =  fc.getSelectedFile();
        
            void saveToFile(String fileName, JTextField textField) throws Exception 
                   FileOutputStream out = new FileOutputStream(fileName, true);
                   out.write(textField.getText().getBytes());
                 

    );
    btnSave.setBounds(315, 31, 89, 47);
    contentPane.add(btnSave);

    JButton btnLoad = new JButton("Load");
    btnLoad.setBounds(315, 168, 89, 47);
    contentPane.add(btnLoad);

    JButton btnReset = new JButton("Reset");
    btnReset.addActionListener(new ActionListener() 
        public void actionPerformed(ActionEvent e)
            txtNumber1.setText(null);
            txtNumber2.setText(null);
            txtAnswer.setText(null);
        
        );
    btnReset.setBounds(315, 98, 89, 47);
    contentPane.add(btnReset);

    txtNumber2 = new JTextField();
    txtNumber2.setBounds(102, 75, 100, 26);
    contentPane.add(txtNumber2);
    txtNumber2.setColumns(10);

    JLabel lblNumber2 = new JLabel("Number 2:");
    lblNumber2.setBounds(21, 81, 80, 14);
    contentPane.add(lblNumber2);

    add = new JButton("+");
    add.addActionListener(new ActionListener() 
        public void actionPerformed(ActionEvent a) 
            String n1 = txtNumber1.getText();
            String n2 = txtNumber2.getText();
            Float num1 = Float.parseFloat(n1);
            Float num2 = Float.parseFloat(n2);   
            Object clicked = a.getSource();
            if(add==clicked)
                txtAnswer.setText(String.valueOf(num1+num2));

            
        
    );
    add.setBounds(50, 110, 89, 23);
    contentPane.add(add);

    sub = new JButton("-");
    sub.addActionListener(new ActionListener() 
        public void actionPerformed(ActionEvent s) 
            String n1 = txtNumber1.getText();
            String n2 = txtNumber2.getText();
            Float num1 = Float.parseFloat(n1);
            Float num2 = Float.parseFloat(n2);   
            Object clicked = s.getSource();
            if(sub == clicked)
            
            txtAnswer.setText(String.valueOf(num1-num2));
            
        
    );
    sub.setBounds(153, 110, 89, 23);
    contentPane.add(sub);

    mul = new JButton("x");
    mul.addActionListener(new ActionListener() 
        public void actionPerformed(ActionEvent m) 
            String n1 = txtNumber1.getText();
            String n2 = txtNumber2.getText();
            Float num1 = Float.parseFloat(n1);
            Float num2 = Float.parseFloat(n2);   
            Object clicked = m.getSource();
            if(mul == clicked)
            
            txtAnswer.setText(String.valueOf(num1*num2));
            
        
    );
    mul.setBounds(50, 144, 89, 23);
    contentPane.add(mul);

    div = new JButton("/");
    div.addActionListener(new ActionListener() 
        public void actionPerformed(ActionEvent d) 
            String n1 = txtNumber1.getText();
            String n2 = txtNumber2.getText();
            Float num1 = Float.parseFloat(n1);
            Float num2 = Float.parseFloat(n2);   
            @SuppressWarnings("unused")
            Object clicked = d.getSource();
            if(num2 == 0)
                txtAnswer.setText("Can't Divide By Zero");
                else
                txtAnswer.setText(String.valueOf(num1/num2));
                

    );
    div.setBounds(153, 141, 89, 23);
    contentPane.add(div);           


【问题讨论】:

您应该发布一个更简单的示例来说明您正在尝试做什么。代码太多,无法按原样梳理。 我不知道导致问题的具体部分在哪里+我有两个问题数字输入和保存输入以及结果能够再次加载它对于长代码但我认为我应该发布它全部 ***.com/questions/6111003/… 这会回答你的问题。 你想要一个 JFormattedTextField。 docs.oracle.com/javase/tutorial/uiswing/components/… 【参考方案1】:

使用DocumentFilterregex 你可以检查你需要什么类型的输入。为了获得号码,这可以帮助你。

((AbstractDocument)txtNumber1.getDocument()).setDocumentFilter(new DocumentFilter() 
        @Override
        public void replace(FilterBypass fb, int offset, int length,
                String text, AttributeSet attrs)
                throws BadLocationException 
            String numS = fb.getDocument().getText(0,
                    fb.getDocument().getLength());
            numS += text;
            if (numS.matches("^[0-9]+[.]?[0-9]*$")) 
                super.replace(fb, offset, length, text, attrs);
            
        

        @Override
        public void insertString(FilterBypass fb, int offset,
                String string, AttributeSet attr)
                throws BadLocationException 
            String numS = fb.getDocument().getText(0,
                    fb.getDocument().getLength());
            numS += string;


            if ( numS.matches("^[0-9]+[.]?[0-9]*$")) 
                super.insertString(fb, offset, string, attr);
            
        
    );

【讨论】:

【参考方案2】:

使用 key listner 接口和处理事件 我正在编写一个示例代码以允许在 JTextField 中只允许数字,这里我只显示 keyReleased(KeyEvent e) 实现,您还需要实现 keyTyped 和 keyPressed 只需将其实现为空白即可编译代码。在我的代码范围从 48 到 57 是 0 到 9 的 acsii 值,127 是删除键,8 是退格键,65535 是箭头键代码。如有疑问,请询问。如果在文本字段中输入字母,则显示消息框希望您实现它。

             KeyListener keyListener; 
             keyListener = new KeyListener()
               @Override
        public void keyReleased(KeyEvent e) 

               char code=e.getKeyChar();

            if(((int)code<48 || (int)code>57 )&& (int)code!=8 && (int)code!=127 &&(int)code!=65535)
            
                String str=text.getText();
                str=str.substring(0, str.length()-1);
                text.setText(str);
                str=text.getText();
                for(int i=0; i<str.length(); i++)
                
                    if(((int)str.charAt(i)<48 || (int)str.charAt(i)>57) && (int)str.charAt(i)!=8)
                    
                        String c=""+str.charAt(i);
                        String a=str.replace(c,"");
                        System.out.println("a="+a);
                        text.setText(a);
                    
                
            


        

    ;
    text.addKeyListener(keyListener);

【讨论】:

使用 KeyAdapter 不需要实现 all 方法。 (1-),不要玩 KeyEvents。 Swing 有更新更好的 API(如 DocumentFilter),适用于所有情况。如果您将文本“粘贴”到文本字段中,此解决方案将不起作用。 感谢您告诉我不知道 DocumentFilter

以上是关于如何仅在文本字段中输入数字[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在javascript的输入数字类型字段中输入值时如何显示输入文本字段?

JavaScript - 如何检查是不是在数字输入字段中输入了字母字符或符号[重复]

触发所有移动设备输入文本的数字键盘[重复]

如何检查是不是在 KeyUp 事件的文本框中输入了数字或字母 [重复]

如何限制文本字段只能输入十进制数字?

如何让用户在 SwiftUI 文本字段中仅使用数字输入货币,同时保留 $ 和 .?