Как ограничить количество символов, введенных в JTextField?Как ограничить количество символов в JTextField?
Предположим, что я хочу ввести 5 символов макс. После этого в него не могут быть введены никакие символы.
Как ограничить количество символов, введенных в JTextField?Как ограничить количество символов в JTextField?
Предположим, что я хочу ввести 5 символов макс. После этого в него не могут быть введены никакие символы.
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)
Еще несколько комментариев для объяснения ответа будут приветствоваться. – jfpoilpret
нет прямой функции, такой как textfield.maximumlimit (10); –
Нет, и он говорит вам использовать класс, который расширяет 'PlainDocument' в javadoc для' JTextField' http://download.oracle.com/javase/6/docs/api/javax/swing/JTextField.html –
Если вы хотите иметь все в одном только кусок кода, то вы можете смешать ответ Тиму с примерный подход, найденный в 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 уже имеет встроенные функции.
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
Прочтите раздел из руководства Swing по адресу Implementing a DocumentFilter для более точного решения.
Это решение будет работать с любым документом, а не только с PlainDocument.
Это более современное решение, чем принятое.
Просто Попробуйте:
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();
}
}
});
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
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();
}
}
}
}
Большой вопрос, и это странно, что свинг инструментарий не включает в себя эту функцию изначально для 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), чтобы оно не обрабатывалось как нормальное.
Я решил эту проблему, используя следующий сегмент кода:
private void jTextField1KeyTyped(java.awt.event.KeyEvent evt) {
boolean max = jTextField1.getText().length() > 4;
if (max){
evt.consume();
}
}
не работает, если пользователь «обманывает» копированием – Ewoks
Хотя использование пользовательского документа будет работать, предпочтительный подход к этому раствору, чтобы использовать либо JFormattedTextField или использовать DocumentFilter. Это обе функции, которые были добавлены в JDK в версии 1.3, я считаю. Учебник Swing охватывает оба этих подхода (и даже удаляет пользовательский подход к документу из учебника). – camickr
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