1

我限制我JTextFields只接受数字。我为此使用了以下代码。

  // my textboxes
  t1=new JTextField(10);
  t2=new JTextField(10);
  t3=new JTextField(10);

  // for the first one
  t1.addKeyListener(new 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();
          }
        }
      });

假设我有 20 个texboxes需要相同的验证检查。那么我们需要将这段代码写 20 次吗?我可以写一个通用的方法来实现这个吗?我是新手Swing

4

6 回答 6

9

同样,使用 DocumentFilter 因为这将处理复制和粘贴,这将允许在Document 接受文本之前进行过滤:

import javax.swing.*;
import javax.swing.text.*;

public class DocListenerEg extends JPanel {
   private static final int FIELD_COUNT = 5;
   private JTextField[] fields = new JTextField[FIELD_COUNT];

   public DocListenerEg() {
      MyDocFilter myFilter = new MyDocFilter();
      for (int i = 0; i < fields.length; i++) {
         fields[i] = new JTextField(5);
         ((PlainDocument) fields[i].getDocument()).setDocumentFilter(myFilter);
         add(fields[i]);
      }
   }

   private class MyDocFilter extends DocumentFilter {
      public void insertString(DocumentFilter.FilterBypass fb, int offset,
            String text, AttributeSet attr) throws BadLocationException {
         for (char c : text.toCharArray()) {
            if (!Character.isDigit(c)) {
               return;
            }
         }
         fb.insertString(offset, text.toUpperCase(), attr);
      }

      public void replace(DocumentFilter.FilterBypass fb, int offset,
            int length, String text, AttributeSet attrs)
            throws BadLocationException {
         for (char c : text.toCharArray()) {
            if (!Character.isDigit(c)) {
               return;
            }
         }
         fb.replace(offset, length, text.toUpperCase(), attrs);
      }
   }

   private static void createAndShowGui() {
      DocListenerEg mainPanel = new DocListenerEg();

      JFrame frame = new JFrame("DocListenerEg");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}
于 2013-06-25T10:22:29.160 回答
4

按照http://www.jroller.com/dpmihai/entry/documentfilter中的说明尝试 DocumentFilter

于 2013-06-25T10:21:17.973 回答
0

将您的匿名类保存到变量中:

KeyListener keyListener= new 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();
      }
    }
  }

接着

t1.addKeyListener(keyListener);
t2.addKeyListener(keyListener);
t3.addKeyListener(keyListener);
...
于 2013-06-25T10:11:52.123 回答
0

创建一个名为的类:

NumberOnlyTextField

使其扩展JTextField,并在构造函数中添加addKeyListener (..) 代码。在那里,您拥有自己的号码验证文本字段。

于 2013-06-25T10:11:58.133 回答
0

我会创建一个私有的布尔方法(如果它只在这个类中使用)或公共的,如果它在其他地方也需要,例如。使用正则表达式:

public boolean checkToBeNumberInput(char c, KeyEvent e){
 if(!char c.matches("[0-9]")||
   (c == KeyEvent.VK_BACK_SPACE) ||
   (c == KeyEvent.VK_DELETE))) {
   getToolkit().beep();
   e.consume();
   return false;

 }
return true;
}

然后调用这个布尔方法,如果它返回 true:

if(checkToBeNumberInput()==false){
System.out.println("only numbers are allowed!");
}

这是一个快速草稿,但我希望它可以帮助某人

于 2013-06-25T10:24:32.633 回答
0

//看事件按键。:私人无效montoingresoKeyPressed(java.awt.event.KeyEvent evt){

    if(Character.isLetter(evt.getKeyChar()))
    {
        //do what you want on this event, when key is pressed named evt
    }

}

于 2017-11-11T23:37:34.813 回答