Редактор ячеек Inputverifier

У меня есть таблица с суммой валюты в одном столбце. Сложность в том, что каждая строка может иметь разную валюту. Я настроил редактор ячеек по умолчанию, который выполняет проверку в stopCellEditing, и он отлично работает. Если данные недействительны, редактор не останавливается, но значение возвращается к исходному значению, а не оставляет недопустимые данные в ячейке. Я установил поведение Focus Lost:

ftf.setFocusLostBehavior(JFormattedTextField.PERSIST);

Я рассмотрел пример для редакторов ячеек (см. Указание средств форматирования и использование фабрик форматирования).) и работает, потому что использует целочисленный формат:

       //Set up the editor for the integer cells.
    integerFormat = NumberFormat.getIntegerInstance();
    NumberFormatter intFormatter = new NumberFormatter(integerFormat);
    intFormatter.setFormat(integerFormat);
    intFormatter.setMinimum(minimum);
    intFormatter.setMaximum(maximum);

    ftf.setFormatterFactory(
            new DefaultFormatterFactory(intFormatter));
    ftf.setValue(minimum);
    ftf.setHorizontalAlignment(JTextField.TRAILING);
    ftf.setFocusLostBehavior(JFormattedTextField.PERSIST);

Эта фабрика форматов устанавливает isEditValid=false в JFormattedTextField, поэтому при вызове stopCellEditing для isEditValid уже установлено значение false. С моей таблицей я не могу использовать средство форматирования, поэтому isEditValid становится истинным, как только он попадает в stopCellEditor. Единственный способ, которым я могу это сделать, - использовать InputVerifier в поле.

Возникает вопрос: можно ли использовать InputVerifiers в ячейках таблицы?

Я попытался переопределить stringToValue и valueToString в Formatter, но у меня нет доступа к деталям валюты строки, только к строке. С помощью InputVerifier я получаю доступ к исходному полю для ячейки, которая является подклассом JFormattedTextField с добавленной информацией о валюте.

Я надеюсь в этом есть смысл.


person Mikerb    schedule 15.09.2014    source источник
comment
Попробовав это, inputverifier вызывается после stopCellEditing с помощью super(StopCellEditing()). Мне нужно проверить поле до этого.   -  person Mikerb    schedule 15.09.2014
comment
Возможный дубликат.   -  person trashgod    schedule 15.09.2014
comment
Не совсем, этот немного глубже. Ячейка таблицы определяется как строка, поэтому нет реальной проверки ошибок, пока пользователь печатает. Когда фокус теряется и вызывается метод stopCellEditor, для флага isEditValid устанавливается значение true. Я выполняю требуемую проверку в этом методе и возвращаю false при возникновении ошибки. Затем ячейка ВОЗВРАЩАЕТСЯ, а не СОХРАНЯЕТСЯ, как я просил. Что я спрашиваю, есть ли способ перехватить редактирование ячейки, чтобы я мог установить для isEditValid значение false? Я мог бы написать собственный форматтер, но он вызывается при каждом нажатии клавиши. Какие-либо предложения?   -  person Mikerb    schedule 16.09.2014


Ответы (1)


Проблема заключалась в том, что при проверке моей FormattedTextString я использовал getValue, а не getText. Значение устанавливается на исходное значение перед вводом новых данных. Тексту присваивается новое значение. Как только это было изменено, оно действовало, как и ожидалось.

Для справки в будущем InputVerifier для FormattedTextField в таблице не вызывается до тех пор, пока не произойдет обработка ячейки, поэтому его нельзя использовать для проверки ячеек таблицы.

person Mikerb    schedule 16.09.2014