Java 输入文本只接受数字

Java 输入文本只接受数字,java,swing,integer,jtextfield,Java,Swing,Integer,Jtextfield,我设计了一个小的swing GUI,它有一些JTextFields,但它有一个validateVariables方法,必须验证接口中的所有字段,有一个名为(IP)的JTextField必须只接受int变量。我如何设置它 p.S JTextfield是在netbeans中用palete工具创建的。当我正确记住swing textfields时,你可以注册为输入/键侦听器,并在每次击键时验证输入。当我正确记住swing textfields时,您可以注册为input/keylistener,并在每次

我设计了一个小的swing GUI,它有一些JTextFields,但它有一个validateVariables方法,必须验证接口中的所有字段,有一个名为(IP)的JTextField必须只接受int变量。我如何设置它


p.S JTextfield是在netbeans中用palete工具创建的。

当我正确记住swing textfields时,你可以注册为输入/键侦听器,并在每次击键时验证输入。

当我正确记住swing textfields时,您可以注册为input/keylistener,并在每次击键时验证输入。

这是JTextField的javadoc

有一个例子

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);
      }
    }
  }
----编辑----

正如@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);  
    }
  });
}

这是JTextField的javadoc

有一个例子

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);
      }
    }
  }
----编辑----

正如@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);  
    }
  });
}

使用
文档过滤器
,这就是它的设计目的


请看一看,尤其是使用
文档过滤器的例子,这就是它的设计目的


看一看,特别是作为示例,只需使用
文档过滤器
仅接受整数即可

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);
}
}

只需使用
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);
}
}

当您想要修改进入字段的内容时,您不应该向文本组件注册
KeyListener
——首先,您可能会产生异常,其次,它不会处理用户将文本粘贴到字段中的情况。如果需要,您不应该向文本组件注册
KeyListener
要修改字段中的内容,首先要冒生成异常的风险,其次不能处理用户将文本粘贴到字段中的情况。还需要重写DocumentFilter的replace(…)方法。还需要重写DocumentFilter的replace(…)方法。