2013-03-26 117 views
0

如何为用户设置输入限制,我的意思是用户只能输入2或4个整数而不能输入。将限制整数设置为JTextField

代码:

JLabel dateD = new JLabel("| Date Day:"); 
dateD.setBounds(170,270, 120, 25); 

dateDD = new JTextField(); 
dateDD.setBounds(235,270, 20, 25); 
+1

请勿使用'setBounds()'来设置组件的大小/位置。 Swing旨在与[布局管理器](http://docs.oracle.com/javase/tutorial/uiswing/layout/visual.html)一起使用。 – camickr 2013-03-26 18:20:20

+0

我知道,你不是第一个告诉我使用LayoutManager的人,我需要使用这种方法....问题是如何使用这种方法固定INT,我已经使用.......(( ( – 2013-03-26 18:23:28

+0

那么,为什么你继续寻求帮助,如果你忽略给出的建议? – camickr 2013-03-26 19:57:26

回答

1

使用DocumentFilter应排在你出去,创建过滤器如下: -

class MaximumCharacters extends DocumentFilter { 

     private int maxLength; 

     public MaximumCharacters() { 
      maxLength = 10; // The number of characters allowed 
     } 

     @Override 
     public void insertString(FilterBypass fb, int offset, String string, 
       AttributeSet attr) throws BadLocationException { 
      if (maxLength > 0 
        && fb.getDocument().getLength() + string.length() <= maxLength) { 
       super.insertString(fb, offset, string, attr); 
      } 
     } 

     @Override 
     public void replace(FilterBypass fb, int offset, int length, 
       String text, AttributeSet attrs) throws BadLocationException { 

      if ((fb.getDocument().getLength() + text.length() - length) <= maxLength) 
       super.replace(fb, offset, length, text, attrs); 
     } 
    } 

然后,设置DocumentFilterJTextField组件,如下所示: -

((AbstractDocument) dateDD.getDocument()).setDocumentFilter(new MaximumCharacters()); 
+0

+ 1为DocumentFilter。请参阅Swing教程[实现文档过滤器](http://docs.oracle.com/javase/tutorial/uiswing/components/generaltext.html#filter)获取更多信息。 – camickr 2013-03-26 18:21:29

+0

您能否解释一下更多如何使用DocumentFilter? – 2013-03-26 18:22:01

+0

可能我是愚蠢的......但我无法得到如何实施这种方法给我...... – 2013-03-26 18:28:18

0

对于下面的答案是一个Util为了处理上述情况而创建的方法 -

/** 
    * Method installNumericMaximumCharacters. 
    * 
    * @param document 
    *   AbstractDocument 
    * @param numberofChars 
    *   int 
    */ 
    public static void installNumericMaximumCharacters(
      AbstractDocument document, final int numberofChars) { 
     document.setDocumentFilter(new DocumentFilter() { 
      @Override 
      public void insertString(FilterBypass fb, int offset, 
        String string, AttributeSet attr) 
        throws BadLocationException { 
       try { 
        if (string.equals(".") 
          && !fb.getDocument() 
            .getText(0, fb.getDocument().getLength()) 
            .contains(".")) { 
         super.insertString(fb, offset, string, attr); 
         return; 
        } 
        Double.parseDouble(string); 
        if (fb.getDocument().getLength() + string.length() <= numberofChars) { 
         super.insertString(fb, offset, string, attr); 
        } else { 
         Toolkit.getDefaultToolkit().beep(); 
        } 
       } catch (Exception e) { 
        Toolkit.getDefaultToolkit().beep(); 
       } 
      } 

      @Override 
      public void replace(FilterBypass fb, int offset, int length, 
        String text, AttributeSet attrs) 
        throws BadLocationException { 
       try { 
        if (text.equals(".") 
          && !fb.getDocument() 
            .getText(0, fb.getDocument().getLength()) 
            .contains(".")) { 
         super.insertString(fb, offset, text, attrs); 
         return; 
        } 
        Double.parseDouble(text); 
        int l = fb.getDocument().getLength() - length 
          + text.length(); 
        if (length > 0) { 
         fb.getDocument().remove(offset, length); 
        } 
        if (l <= numberofChars) { 
         super.insertString(fb, offset, text, attrs); 

        } else { 
         Toolkit.getDefaultToolkit().beep(); 
        } 
       } catch (Exception e) { 
        Toolkit.getDefaultToolkit().beep(); 
       } 
      } 
     }); 
    } 

该方法有点自我解释。当Document发生变化时,它会唤起DocumentFilter。请注意,您不能setText()相同Document。你将不得不为它使用FilterBypass对象。