2012-04-03 119 views
2

我想限制用户应该允许在文本字段中键入的字符。我怎样才能限制JFormattedTextField只接受0或1的8位数字?JFormattedTextFiled限制为0或1

+0

参见本[Q&A](HTTP:// stackoverflow.com/q/9995383/230513)。 – trashgod 2012-04-03 20:19:29

回答

5

使用DocumentFilter与模式的JTextField,那么也许有不使用JFormattedTextField

示例程序来帮助您的事业需要:

import java.awt.Toolkit; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 
import javax.swing.SwingUtilities; 
import javax.swing.text.AbstractDocument; 
import javax.swing.text.AttributeSet; 
import javax.swing.text.BadLocationException; 
import javax.swing.text.DocumentFilter; 

public class TextFieldLimit 
{ 
    private void createAndDisplayGUI() 
    { 
     JFrame frame = new JFrame("JTextField Limit"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.setLocationByPlatform(true); 

     JPanel contentPane = new JPanel(); 

     JTextField tfield = new JTextField(10); 
     /* 
     * Here we are using Document Filter 
     * to specify the size of the content 
     * i.e. 8 in your case. 
     */ 
     ((AbstractDocument)tfield.getDocument()).setDocumentFilter(
             new DocumentLimitAndInput(8)); 

     contentPane.add(tfield); 

     frame.getContentPane().add(contentPane); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    public static void main(String... args) 
    { 
     SwingUtilities.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       new TextFieldLimit().createAndDisplayGUI(); 
      } 
     }); 
    } 
} 

class DocumentLimitAndInput extends DocumentFilter 
{ 
    private int maxCharacters; 

    public DocumentLimitAndInput(int size) 
    { 
     maxCharacters = size; 
    } 

    public void insertString(FilterBypass fb, int offset 
           , String text, AttributeSet aset) 
             throws BadLocationException 
    { 
     int size = fb.getDocument().getLength() + text.length(); 
     /* 
     * If the size is less than or equal to the permissible value 
     * and the input character is either 0 or 1, only in that 
     * case we will allow it to go through, else a BEEP 
     * sound is what a user will hear :-) 
     */ 
     if (size <= maxCharacters && (text.equals("0") || text.equals("1"))) 
      super.insertString(fb, offset, text, aset); 
     else 
      Toolkit.getDefaultToolkit().beep(); 
    } 

    public void replace(FilterBypass fb, int offset, int length 
           , String text, AttributeSet aset) 
             throws BadLocationException 
    { 
     int size = fb.getDocument().getLength() + text.length(); 
     /* 
     * If the size is less than or equal to the permissible value 
     * and the input character is either 0 or 1, only in that 
     * case we will allow it to go through, else a BEEP 
     * sound is what a user will hear :-) 
     */ 
     if (size <= maxCharacters && (text.equals("0") || text.equals("1"))) 
      super.replace(fb, offset, length, text, aset); 
     else 
      Toolkit.getDefaultToolkit().beep(); 
    } 
} 
+0

+1,为什么使用'JFormattedTextField'时可以通过'DocumentFilter'轻松实现:-) – 2012-04-03 15:35:13

+0

对不起,我的编辑,只是忍不住自己,在做艰苦的工作:-) – 2012-04-03 16:07:40

+0

它的工作原理。谢谢 – Sachindra 2012-04-04 17:06:49