如何将JTextField输入限制为仅数字和仅2个字符?

时间:2014-01-07 18:40:33

标签: java swing jtextfield keylistener keycode

我正在尝试创建一个只允许数字输入的JTextField,只允许两个字符(换句话说只允许数字0-99)。我查看了一些教程,并尝试将输入限制为仅限数字到目前为止。 到目前为止我的代码的问题是接受所有关键输入。我试图反转大于和小于符号,它根本不再接受任何输入。我认为问题在于关键字符代码,但是一些帮助会很好,因为我找不到任何有用的东西(我看到的每个地方都有不同的Java键盘)。

if(event.getSource() == txtMasterSound)
    {
        if(event.getKeyCode() < 0 || event.getKeyCode() > 9)
        {
            System.out.println("Your input was invalid");
            event.consume();
        }
        else
        {
            System.out.println("Your input was valid");
            return;
        }
    }

至于限制角色,我真的不知道从哪里开始,所以一些指向正确的方向也会很好。

2 个答案:

答案 0 :(得分:6)

  1. 使用JFormattedTextField代替
  2. 或者在字段的文档上使用DocumentFilter来过滤无效输入。
  3. 或使用InputVerifier

  4. 例如,一个DoumentFilter

    import javax.swing.*;
    import javax.swing.text.AttributeSet;
    import javax.swing.text.BadLocationException;
    import javax.swing.text.DocumentFilter;
    import javax.swing.text.PlainDocument;
    
    public class MyDocFilter {
       private static void createAndShowGUI() {
          JTextField field1 = new JTextField(10);
          PlainDocument doc = (PlainDocument) field1.getDocument();
          doc.setDocumentFilter(new DocumentFilter() {
             private boolean isValid(String testText) {
                if (testText.length() > 2) {
                   return false;
                }
                if (testText.isEmpty()) {
                   return true;
                }
                int intValue = 0;
                try {
                   intValue = Integer.parseInt(testText.trim());
                } catch (NumberFormatException e) {
                   return false;
                }
                if (intValue < 0 || intValue > 99) {
                   return false;
                }
                return true; 
             }
    
             @Override
             public void insertString(FilterBypass fb, int offset, String text,
                   AttributeSet attr) throws BadLocationException {
                StringBuilder sb = new StringBuilder();
                sb.append(fb.getDocument().getText(0, fb.getDocument().getLength()));
                sb.insert(offset, text);
                if (isValid(sb.toString())) {
                   super.insertString(fb, offset, text, attr);
                }
             }
    
             @Override
             public void replace(FilterBypass fb, int offset, int length,
                   String text, AttributeSet attrs) throws BadLocationException {
                StringBuilder sb = new StringBuilder();
                sb.append(fb.getDocument().getText(0, fb.getDocument().getLength()));
                int end = offset + length;
                sb.replace(offset, end, text);
                if (isValid(sb.toString())) {
                   super.replace(fb, offset, length, text, attrs);
                }
             }
    
             @Override
             public void remove(FilterBypass fb, int offset, int length)
                   throws BadLocationException {
                StringBuilder sb = new StringBuilder();
                sb.append(fb.getDocument().getText(0, fb.getDocument().getLength()));
                int end = offset + length;
                sb.delete(offset, end);
                if (isValid(sb.toString())) {
                   super.remove(fb, offset, length);
                }
             }
          });
    
    
          JPanel panel = new JPanel();
          panel.add(field1);
    
          JFrame frame = new JFrame("MyDocFilter");
          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          frame.getContentPane().add(panel);
          frame.pack();
          frame.setLocationRelativeTo(null);
          frame.setVisible(true);
       }
    
       public static void main(String[] args) {
          SwingUtilities.invokeLater(new Runnable() {
             public void run() {
                createAndShowGUI();
             }
          });
       }
    }
    

答案 1 :(得分:-1)

这可能有点草率,但你可以添加一个侦测器来检测更改(当输入内容时),每次键入内容时,你检查键入的内容,如果不是0-9,则删除最后一个字符如果它超过2个字符,则删除多余的字符。

这可能会有用(我还没试过),但我认为JFormattedTextField更专业。