2013-10-05 110 views
0

我試圖限制多個jtextfield上的字符輸入。這兩個字段有不同的字符限制,同時他們不能接受空白作爲他們的第一個字符...例如第一個字段只有5個字符的限制,然後第二個字段有10char限制..我被困在這個問題上這裏是我使用的代碼:在jtextfield或區域限制字符輸入

import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
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 Restriction { 

    public Restriction() { 
     initComponents(); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new Restriction(); 
      } 
     }); 
    } 

    private void initComponents() { 
     GridBagConstraints Cons = new GridBagConstraints(); 
     JFrame frame = new JFrame(); 
     JPanel panel = new JPanel(new GridBagLayout()); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     JTextField jtf = new JTextField(20); 
     JTextField jtf2 = new JTextField(20); 
     //add filter to document 
     ((AbstractDocument) jtf.getDocument()).setDocumentFilter(new MyDocumentFilter()); 
     MyDocumentFilter.charLimit(5); 
     ((AbstractDocument) jtf2.getDocument()).setDocumentFilter(new MyDocumentFilter()); 
     MyDocumentFilter.charLimit(10); 
     Cons.gridy = 0; 
     panel.add(jtf, Cons); 
     Cons.gridy = 1; 
     panel.add(jtf2,Cons); 
     frame.add(panel); 
     frame.pack(); 
     frame.setVisible(true); 
    } 
} 

class MyDocumentFilter extends DocumentFilter { 

    static int Limit; 

    public static void charLimit(int Limitation){ 
     Limit = Limitation; 
    } 

    @Override 
    public void replace(FilterBypass fb, int i, int i1, String string, AttributeSet as) throws BadLocationException { 
     //we want standard behavior if we are not placing space at start of JTextField 
     //or if we are placing text at start of JTextField but first character is not whitespace 
     if (i!=0 && i< Limit || (i==0 && !Character.isWhitespace(string.charAt(0)))){ 
      super.replace(fb, i, i1, string, as); 
     }else{ 
      System.out.println("no spaces allowed"); 
     } 
    } 

    @Override 
    public void remove(FilterBypass fb, int i, int i1) throws BadLocationException { 
     super.remove(fb, i, i1); 
    } 

    @Override 
    public void insertString(FilterBypass fb, int i, String string, AttributeSet as) throws BadLocationException { 
     super.insertString(fb, i, string, as); 

    } 
} 

回答

0

我會用javax.swing.text.Document

可以啓動它想:

public static Document createTextDocument(int maxLength){ 
     return new TextDocument(maxLength); 
    } 

... 

Document document = createTextDocument(5); // limit to 5 chars 
textField1.setDocument(document); 

document = createTextDocument(10); // limit to 10 chars 
textField2.setDocument(document); 

這是自TextDocument類:

public class TextDocument extends PlainDocument{ 


    private static final long serialVersionUID = 1L; 
    private int maxLength = Integer.MAX_VALUE; 

    TextDocument(){} 
    TextDocument(int maxlength){this.maxLength=maxlength;} 

    public void setMaxLength(int maxLength) { 
      if (maxLength < 0) 
       throw new IllegalArgumentException("maxLength<0"); 
      this.maxLength = maxLength; 
     } 

    public void insertString(int offset, String str, AttributeSet attr) 
    throws BadLocationException { 
     if (validateLength(offset, str) == false) 
       return; 

      super.insertString(offset, str, attr); 
    } 

    private boolean validateLength(int offset, String toAdd) { 
      String str_temp; 
      //String str_text = ""; 
      String str1 = ""; 
      String str2 = ""; 
      try { 
       str1 = getText(0, offset); 
       str2 = getText(offset, getLength() - offset); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 

      str_temp = str1 + toAdd + str2; 
      if (maxLength < str_temp.length()) { 
       beep(); 
       return false; 
      } else 
       return true; 

     } 

     private void beep() { 
      java.awt.Toolkit.getDefaultToolkit().beep(); 
     } 
} 

希望這將有助於

+0

感謝您的答覆..但我的問題仍然存在,我試圖限制2 JTextField中具有不同的字符限制,但同時它不接受空格作爲它的第一個字符 – Criz

+0

看我的例子,你用'TextDocument '剛開始時只提供關於空白空間的5和10 –

+0

,只需在'validateLength'方法中改變我的類。非常簡單 –

0

你能避免使用文檔通過重寫每個JTextField中的keyTyped事件的複雜性:

txtGuess = new JTextField(); 
txtGuess.addKeyListener(new KeyAdapter() { 
    public void keyTyped(KeyEvent e) { 
     if (txtGuess.getText().length() >= 3) // limit textfield to 3 characters 
      e.consume(); 
    } 
}); 

這限制了一個猜謎遊戲文本字段中的字符數通過覆蓋keyTyped事件並檢查文本字段是否已經有3個字符 - 如果是這樣,您正在「消費」關鍵事件(e),以便它不像正常那樣得到處理。

希望它的幫助。