У меня есть таблица с суммой валюты в одной колонке. Трудность состоит в том, что каждая строка может иметь другую валюту. Я создал редактор ячейки по умолчанию, который выполняет validaion в stopCellEditing, который работает нормально. Если данные недействительны, редактор не останавливается, но значение возвращается к исходному значению, а не оставляет недопустимые данные в ячейке. Я установил функцию «Потеря фокуса»:Редактор ячейки Inputverifier
ftf.setFocusLostBehavior (JFormattedTextField.PERSIST);
Я посмотрел на пример для сотовых редакторов (см Specifying Formatters and Using Formatter Factories), и это работает, потому что он использует целочисленный формат:
//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 = ложное в JFormattedTextField так, когда stopCellEditing называется он уже установил isEditValid равным false. С моей таблицей я не могу использовать форматировщик, поэтому isEditValid имеет значение true, когда он получает stopCellEditor. Единственный способ сделать это - использовать InputVerifier в поле.
Вопрос в следующем: целесообразно ли использовать InputVerifiers на ячейках таблицы?
Я искал переопределение stringToValue и valueToString в Formatter, но у меня нет доступа к деталям валюты строки, просто строка. С помощью InputVerifier я получаю доступ к исходному полю для ячейки, которая является подклассом JFormattedTextField с добавленной информацией о валюте.
Надеюсь, это имеет смысл.
Попытка запускать входной сигнал вызван после stopCellEditing супер (StopCellEditing()). Мне нужно проверить поле до этого. – Mikerb
Положительный [дубликат] (http://stackoverflow.com/q/7531513/230513). – trashgod
Не совсем, это немного глубже. Ячейка таблицы определяется как строка, поэтому при проверке подлинности пользователя нет реальной проверки ошибок. Когда фокус потерян и метод stopCellEditor называется флагом isEditValid, устанавливается значение true. Я выполняю проверку, требуемую в этом методе, и возвращаю false при возникновении ошибки. Затем ячейка REVERTED, а не PERSISTED, как я просил. Я спрашиваю, есть ли способ перехватить редактирование ячейки, чтобы я мог установить isEditValid в false? Я мог бы написать собственный форматировщик, но он вызван для каждой нажатой клавиши. Какие-либо предложения? – Mikerb