Нет пробелов в JTextField

Как я могу запретить пользователям помещать пробелы в JTextField?
Не должно быть даже возможности писать пробелы.


person ddejmek    schedule 07.04.2009    source источник


Ответы (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 также необходимо переопределить/реализовать!

person user85421    schedule 07.04.2009
comment
DocumentFilter лучше. Существуют также методы для вставки текста, отличные от insertString. - person Tom Hawtin - tackline; 07.04.2009
comment
@Tom: правда, я этого не видел. Лучший способ (теперь я знаю) для фильтрации! - person user85421; 07.04.2009
comment
Хорошо, но мне пришлось также реализовать replaceString, так как кажется, что вставкаString никогда не использовалась JTextField! - person lapo; 22.06.2012
comment
@lapo Я вижу это по-другому - здесь (Java 7, Windows XP) вызывается только insertString(), а не replaceString(), по крайней мере, не при использовании клавиатуры и копировании и вставке ... В любом случае, я бы переопределил оба, но я думаю, что решение с использованием DocumentFilter более подходит, см. ответ Тома - person user85421; 22.06.2012
comment
Я думал, что фильтр тоже был приятнее, но он, кажется, вызывается только по расфокусировке, а не побуквенно, и то, что я хотел, чтобы вообще не писать какую-то букву. - person lapo; 25.06.2012
comment
@lapo фильтр вызывается каждый раз при изменении документа (как описано в DocumentFilter). Протестировано с JTextField, отображаемым JOptionPane (Java 7, Nimbus Look&Feel, Windows XP) - методы фильтра, на самом деле только replace, вызываются для каждой набранной буквы - person user85421; 26.06.2012
comment
@CarlosHeuberger Извините, я перепутал два вопроса! (Я говорил о подходе JFormattedTextField) На самом деле я сам использовал DocumentFilter с самого начала, но я прокомментировал ваш, потому что там был пример кода. - person lapo; 26.06.2012

Вы можете использовать раскладку клавиатуры. Посмотрите этот пример, запрещающий пробел будет выглядеть следующим образом:

KeyStroke keyStroke = KeyStroke.getKeyStroke(Character.valueOf(' '), 0);
textField.getInputMap(JComponent.WHEN_FOCUSED).put(keyStroke, "none");
person Tim Büthe    schedule 07.04.2009

Вероятно, лучший способ сделать это — использовать Document с DocumentFilter, который удаляет все введенные, вставленные или иным образом вставленные пробелы. Я написал запись в блоге о небольшой программе Swing, которая демонстрирует эту технику (в этом случае разрешать ввод только целых чисел) - Описание Источник.

Расширение подтипа Document возможно, но более подвержено ошибкам (и привязывает вас к конкретной реализации).

Попытка перехватить нажатия клавиш на самом деле не работает (это неправильный уровень абстракции, поэтому упускается любой другой способ вставки текста, такой как вставка, dnd и т. д.).

JFormattedTextField — это хороший способ убедиться, что любой пользовательский интерфейс — отстой.

person Tom Hawtin - tackline    schedule 07.04.2009