输入文本只接受数字

时间:2014-02-24 18:54:07

标签: java swing integer jtextfield

我设计了一个带有一些JTextFields的小摆动GUI,但是它有一个validateVariables方法,它必须验证接口内的所有字段,有一个JTextField调用(IP)必须只接受int变量我该如何设置它像那样?

P.S JTextfield是用nette工具创建的。

4 个答案:

答案 0 :(得分:2)

只需使用DocumentFilter即可接受整数。

import java.awt.*;
import java.awt.event.KeyEvent;
import javax.swing.*;
import javax.swing.text.AbstractDocument;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException; 
import javax.swing.text.DocumentFilter;
import javax.swing.text.DocumentFilter.FilterBypass;

public class InputInteger
{
private JTextField tField;
private JLabel label=new JLabel();
private MyDocumentFilter documentFilter;

private void displayGUI()
{
    JFrame frame = new JFrame("Input Integer Example");
    frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

    JPanel contentPane = new JPanel();
    contentPane.setBorder(
        BorderFactory.createEmptyBorder(5, 5, 5, 5));
    tField = new JTextField(10);
    ((AbstractDocument)tField.getDocument()).setDocumentFilter(
            new MyDocumentFilter());
    contentPane.add(tField); 
    contentPane.add(label);


    frame.setContentPane(contentPane);
    frame.pack();
    frame.setLocationByPlatform(true);
    frame.setVisible(true);
}
public static void main(String[] args)
{
    Runnable runnable = new Runnable()
    {
        @Override
        public void run()
        {
            new InputInteger().displayGUI();
        }
    };
    EventQueue.invokeLater(runnable);
}
}

class MyDocumentFilter extends DocumentFilter{
    private static final long serialVersionUID = 1L;
    @Override
public void insertString(FilterBypass fb, int off
                    , String str, AttributeSet attr) 
                            throws BadLocationException 
{
    // remove non-digits
    fb.insertString(off, str.replaceAll("\\D++", ""), attr);
} 
@Override
public void replace(FilterBypass fb, int off
        , int len, String str, AttributeSet attr) 
                        throws BadLocationException 
{
    // remove non-digits
    fb.replace(off, len, str.replaceAll("\\D++", ""), attr);
}
}

答案 1 :(得分:1)

当我记得正确摆放文本字段时,您可以注册为输入/键盘记录器并在每次按键时验证输入。

答案 2 :(得分:1)

这是JTextField的javadoc http://docs.oracle.com/javase/7/docs/api/javax/swing/JTextField.html

有一个例子

public class UpperCaseField extends JTextField {

  public UpperCaseField(int cols) {
    super(cols);
  }

  protected Document createDefaultModel() {
    return new UpperCaseDocument();
  }

  static class UpperCaseDocument extends PlainDocument {

    public void insertString(int offs, String str, AttributeSet a)
      throws BadLocationException {

        if (str == null) {
          return;
        }
        char[] upper = str.toCharArray();
        for (int i = 0; i < upper.length; i++) {
          upper[i] = Character.toUpperCase(upper[i]);
        }
        super.insertString(offs, new String(upper), a);
      }
    }
  }

此示例将所有用户输入更改为大写。 只需修改insertString方法,删除所有非数字字符, 您可以使文本字段仅接受数字。

示例:

public void insertString(int offs, String str, AttributeSet a)
    throws BadLocationException {
  if (str == null) {
    return;
  }
  super.insertString(offs, str.replaceAll("[^0-9]", ""), a);
}

----编辑----

正如@MadProgrammer所说,DocumentFilter是另一种方法,例如:

Document document = someJTextField.getDocument();
if (document instanceof AbstractDocument) {
  ((AbstractDocument) doc).setDocumentFilter(new DocumentFilter() {
    public void insertString(DocumentFilter.FilterBypass fb, int offset,  
        String str, AttributeSet a) throws BadLocationException {  
      fb.insertString(offset, str.replaceAll("[^0-9]", ""), a);  
    }
  });
}

答案 3 :(得分:1)

使用DocumentFilter,这就是它的设计目标。

查看Text Component Features,特别是Implementing a Document Filterhere示例