2010-08-19 3 views
23

Как ограничить количество символов, введенных в JTextField?Как ограничить количество символов в JTextField?

Предположим, что я хочу ввести 5 символов макс. После этого в него не могут быть введены никакие символы.

+2

Хотя использование пользовательского документа будет работать, предпочтительный подход к этому раствору, чтобы использовать либо JFormattedTextField или использовать DocumentFilter. Это обе функции, которые были добавлены в JDK в версии 1.3, я считаю. Учебник Swing охватывает оба этих подхода (и даже удаляет пользовательский подход к документу из учебника). – camickr

+0

FYI Начиная с версии Java 1.4, она больше не требуется и рекомендуется использовать «Документ» для этой функции, вместо этого используйте «DocumentFilter», см. [Реализация фильтра документов] (http://docs.oracle.com/javase /tutorial/uiswing/components/generaltext.html#filter) и [Примеры DocumentFilter] (http://www.jroller.com/dpmihai/entry/documentfilter) для получения дополнительной информации. – MadProgrammer

ответ

29

http://www.rgagnon.com/javadetails/java-0198.html

import javax.swing.text.PlainDocument 

public class JTextFieldLimit extends PlainDocument { 
    private int limit; 

    JTextFieldLimit(int limit) { 
    super(); 
    this.limit = limit; 
    } 

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

    if ((getLength() + str.length()) <= limit) { 
     super.insertString(offset, str, attr); 
    } 
    } 
} 

Тогда

import java.awt.*; 
import javax.swing.*; 

public class DemoJTextFieldWithLimit extends JApplet{ 
    JTextField textfield1; 
    JLabel label1; 

    public void init() { 
    getContentPane().setLayout(new FlowLayout()); 
    // 
    label1 = new JLabel("max 10 chars"); 
    textfield1 = new JTextField(15); 
    getContentPane().add(label1); 
    getContentPane().add(textfield1); 
    textfield1.setDocument 
     (new JTextFieldLimit(10)); 
    } 
} 

(первый результат от Google)

+3

Еще несколько комментариев для объяснения ответа будут приветствоваться. – jfpoilpret

+1

нет прямой функции, такой как textfield.maximumlimit (10); –

+0

Нет, и он говорит вам использовать класс, который расширяет 'PlainDocument' в javadoc для' JTextField' http://download.oracle.com/javase/6/docs/api/javax/swing/JTextField.html –

7

Если вы хотите иметь все в одном только кусок кода, то вы можете смешать ответ Тиму с примерный подход, найденный в API для JTextField, и вы получите что-то вроде этого:

public class JTextFieldLimit extends JTextField { 
    private int limit; 

    public JTextFieldLimit(int limit) { 
     super(); 
     this.limit = limit; 
    } 

    @Override 
    protected Document createDefaultModel() { 
     return new LimitDocument(); 
    } 

    private class LimitDocument extends PlainDocument { 

     @Override 
     public void insertString(int offset, String str, AttributeSet attr) throws BadLocationException { 
      if (str == null) return; 

      if ((getLength() + str.length()) <= limit) { 
       super.insertString(offset, str, attr); 
      } 
     }  

    } 

} 

Тогда нет необходимости добавлять документ в JTextFieldLimit, поскольку JTextFieldLimit уже имеет встроенные функции.

+0

FYI Начиная с версии Java 1.4, это больше не требуется и рекомендуется использовать «Документ» для этой функции, вместо этого используйте «DocumentFilter», см. [Реализация фильтра документов] (http://docs.oracle.com/javase/tutorial/uiswing/components/generaltext.html#filter) и [Примеры DocumentFilter] (http://www.jroller.com/dpmihai/entry/documentfilter) для получения более подробной информации – MadProgrammer

4

Прочтите раздел из руководства Swing по адресу Implementing a DocumentFilter для более точного решения.

Это решение будет работать с любым документом, а не только с PlainDocument.

Это более современное решение, чем принятое.

2

Просто Попробуйте:

textfield.addKeyListener(new java.awt.event.KeyAdapter() { 
    public void keyTyped(java.awt.event.KeyEvent evt) { 
     if(textfield.getText().length()>=5&&!(evt.getKeyChar()==KeyEvent.VK_DELETE||evt.getKeyChar()==KeyEvent.VK_BACK_SPACE)) { 
      getToolkit().beep(); 
      evt.consume(); 
     } 
    } 
}); 
+2

FYI Начиная с версии Java 1.4 она больше не требуется и рекомендуется использовать «Документ» для этой функции, вместо этого используйте 'DocumentFilter', см. [Реализация Фильтр документов] (http://docs.oracle.com/javase/tutorial/uiswing/components/generaltext.html#filter) и [Примеры DocumentFilter] (http://www.jroller.com/dpmihai/entry/documentfilter) для более подробной информации, «KeyListener» никогда не является хорошей идеей с текстовыми компонентами. – MadProgrammer

1
import java.awt.KeyboardFocusManager; 
import javax.swing.InputVerifier; 
import javax.swing.JTextField; 
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; 

/** 
* 
* @author Igor 
*/ 
public class CustomLengthTextField extends JTextField { 

    protected boolean upper = false; 
    protected int maxlength = 0; 

    public CustomLengthTextField() { 
     this(-1); 
    } 

    public CustomLengthTextField(int length, boolean upper) { 
     this(length, upper, null); 
    } 

    public CustomLengthTextField(int length, InputVerifier inpVer) { 
     this(length, false, inpVer); 
    } 

    /** 
    * 
    * @param length - maksimalan length 
    * @param upper - turn it to upercase 
    * @param inpVer - InputVerifier 
    */ 
    public CustomLengthTextField(int length, boolean upper, InputVerifier inpVer) { 
     super(); 
     this.maxlength = length; 
     this.upper = upper; 
     if (length > 0) { 
      AbstractDocument doc = (AbstractDocument) getDocument(); 
      doc.setDocumentFilter(new DocumentSizeFilter()); 
     } 
     setInputVerifier(inpVer); 
    } 

    public CustomLengthTextField(int length) { 
     this(length, false); 
    } 

    public void setMaxLength(int length) { 
     this.maxlength = length; 
    } 

    class DocumentSizeFilter extends DocumentFilter { 

     public void insertString(FilterBypass fb, int offs, String str, AttributeSet a) 
       throws BadLocationException { 

      //This rejects the entire insertion if it would make 
      //the contents too long. Another option would be 
      //to truncate the inserted string so the contents 
      //would be exactly maxCharacters in length. 
      if ((fb.getDocument().getLength() + str.length()) <= maxlength) { 
       super.insertString(fb, offs, str, a); 
      } 
     } 

     public void replace(FilterBypass fb, int offs, 
       int length, 
       String str, AttributeSet a) 
       throws BadLocationException { 

      if (upper) { 
       str = str.toUpperCase(); 
      } 

      //This rejects the entire replacement if it would make 
      //the contents too long. Another option would be 
      //to truncate the replacement string so the contents 
      //would be exactly maxCharacters in length. 
      int charLength = fb.getDocument().getLength() + str.length() - length; 

      if (charLength <= maxlength) { 
       super.replace(fb, offs, length, str, a); 
       if (charLength == maxlength) { 
        focusNextComponent(); 
       } 
      } else { 
       focusNextComponent(); 
      } 
     } 

     private void focusNextComponent() { 
      if (CustomLengthTextField.this == KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner()) { 
       KeyboardFocusManager.getCurrentKeyboardFocusManager().focusNextComponent(); 
      } 
     } 
    } 
} 
6

Большой вопрос, и это странно, что свинг инструментарий не включает в себя эту функцию изначально для JTextFields. Но, вот большой ответ от моего курса Udemy.com «Learn Java Как Kid»:

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

Это ограничивает количество символов в угадайку текстового поля до 3-х символов, с помощью переопределения события keyTyped и проверок чтобы увидеть, имеет ли текстовое поле 3 символа, если это так, вы «потребляете» ключевое событие (e), чтобы оно не обрабатывалось как нормальное.

2

Я решил эту проблему, используя следующий сегмент кода:

private void jTextField1KeyTyped(java.awt.event.KeyEvent evt) { 
    boolean max = jTextField1.getText().length() > 4; 
    if (max){ 
     evt.consume(); 
    }   
} 
+0

не работает, если пользователь «обманывает» копированием – Ewoks

Смежные вопросы