Как я могу запретить пользователям помещать пробелы в JTextField?
Не должно быть даже возможности писать пробелы.
Нет пробелов в JTextField
Ответы (3)
Я бы предложил установить документ JTextField с расширенным PlainDocument, в котором вы переопределяете метод insertString. (Также неплохо ограничить размер...)
Что-то вроде:
Document doc = new PlainDocument() {
@Override
public void insertString(int offs, String str, AttributeSet attr)
throws BadLocationException {
String newstr = str.replaceAll(" ", ""); // could use "\\s" instead of " "
super.insertString(offs, newstr, attr);
}
@Override
public void replace(int offs, int len, String str, AttributeSet attr)
throws BadLocationException {
String newstr = str.replaceAll(" ", ""); // could use "\\s" instead of " "
super.replace(offs, len, newstr, attr);
}
};
textField.setDocument(doc);
РЕДАКТИРОВАТЬ:replace
также необходимо переопределить/реализовать!
replaceString
, так как кажется, что вставкаString никогда не использовалась JTextField!
- person lapo; 22.06.2012
insertString()
, а не replaceString()
, по крайней мере, не при использовании клавиатуры и копировании и вставке ... В любом случае, я бы переопределил оба, но я думаю, что решение с использованием DocumentFilter
более подходит, см. ответ Тома
- person user85421; 22.06.2012
replace
, вызываются для каждой набранной буквы
- person user85421; 26.06.2012
JFormattedTextField
) На самом деле я сам использовал DocumentFilter
с самого начала, но я прокомментировал ваш, потому что там был пример кода.
- person lapo; 26.06.2012
Вы можете использовать раскладку клавиатуры. Посмотрите этот пример, запрещающий пробел будет выглядеть следующим образом:
KeyStroke keyStroke = KeyStroke.getKeyStroke(Character.valueOf(' '), 0);
textField.getInputMap(JComponent.WHEN_FOCUSED).put(keyStroke, "none");
Вероятно, лучший способ сделать это — использовать Document
с DocumentFilter
, который удаляет все введенные, вставленные или иным образом вставленные пробелы. Я написал запись в блоге о небольшой программе Swing, которая демонстрирует эту технику (в этом случае разрешать ввод только целых чисел) - Описание Источник.
Расширение подтипа Document
возможно, но более подвержено ошибкам (и привязывает вас к конкретной реализации).
Попытка перехватить нажатия клавиш на самом деле не работает (это неправильный уровень абстракции, поэтому упускается любой другой способ вставки текста, такой как вставка, dnd и т. д.).
JFormattedTextField
— это хороший способ убедиться, что любой пользовательский интерфейс — отстой.