2014-09-15 5 views
1

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

Надеюсь, это имеет смысл.

+0

Попытка запускать входной сигнал вызван после stopCellEditing супер (StopCellEditing()). Мне нужно проверить поле до этого. – Mikerb

+0

Положительный [дубликат] (http://stackoverflow.com/q/7531513/230513). – trashgod

+0

Не совсем, это немного глубже. Ячейка таблицы определяется как строка, поэтому при проверке подлинности пользователя нет реальной проверки ошибок. Когда фокус потерян и метод stopCellEditor называется флагом isEditValid, устанавливается значение true. Я выполняю проверку, требуемую в этом методе, и возвращаю false при возникновении ошибки. Затем ячейка REVERTED, а не PERSISTED, как я просил. Я спрашиваю, есть ли способ перехватить редактирование ячейки, чтобы я мог установить isEditValid в false? Я мог бы написать собственный форматировщик, но он вызван для каждой нажатой клавиши. Какие-либо предложения? – Mikerb

ответ

1

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^