У меня есть таблица с суммой валюты в одном столбце. Сложность в том, что каждая строка может иметь разную валюту. Я настроил редактор ячеек по умолчанию, который выполняет проверку в 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 с добавленной информацией о валюте.
Я надеюсь в этом есть смысл.