Есть ли способ поместить двоеточие в поле jtext, чтобы его нельзя было удалить?

Я хочу, чтобы пользователь вводил время, например, 12:00, но мне нужно выяснить несколько вещей, и я заблудился.

  1. Можно ли ограничить текст до 5 символов и как?
  2. Можно ли встроить двоеточие в код, чтобы пользователь не мог его удалить?
  3. Наконец, могу ли я взять этот код и убедиться, что это только цифры (без учета двоеточия, конечно)

3 ответа

Решение

Ответ заключается в использовании JFormattedTextField и MaskFormatter.

Например:

String mask = "##:##";
MaskFormatter timeFormatter = new MaskFormatter(mask);
JFormattedTextField formattedField = new JFormattedTextField(timeFormatter);

Компилятор Java потребует, чтобы вы перехватывали или выдавали исключение ParseException при создании вашего MaskFormatter, поэтому обязательно сделайте это.

Или просто оставьте текстовое поле и выберите два JSpinner экземпляры, разделенные JLabel содержащие двоеточие (или два JTextField экземпляры).

Не совсем уверен, что это решение будет более интуитивно понятным для пользователя, но я так думаю.

Поздний ответ на старый вопрос; используя DocumentFilter может достичь этого три требования.

непроизводственный код качества может быть таким

String TIME_PATTERN = "^\\d\\d:\\d\\d\\s[AP]M$";

final JTextField tf = new JTextField("00:00 AM", 8);

((AbstractDocument)tf.getDocument()).setDocumentFilter(new DocumentFilter() {
    public void replace(FilterBypass fb, int offs, int length, String str, AttributeSet a) throws BadLocationException {

        String text = fb.getDocument().getText(0, fb.getDocument().getLength());

        text = text.substring(0, offs) + str + text.substring(offs + length);

        if(text.matches(TIME_PATTERN)) {
            super.replace(fb, offs, length, str, a);
            return;
        }

        text = fb.getDocument().getText(0, fb.getDocument().getLength());

        if(offs == 2 || offs == 5)
            tf.setCaretPosition(++offs);

        if(length == 0 && (offs == 0 ||offs == 1 ||offs == 3 ||offs == 4 ||offs == 6))
            length = 1;

        text = text.substring(0, offs) + str + text.substring(offs + length);

        if(!text.matches(TIME_PATTERN))
            return;

        super.replace(fb, offs, length, str, a);

    }

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

    public void remove(FilterBypass fb, int offset, int length) throws BadLocationException { }

});
Другие вопросы по тегам